spree_admin 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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/vercel-deploy-button.svg +14 -0
  3. data/app/assets/tailwind/spree/admin/components/_alerts.css +5 -1
  4. data/app/assets/tailwind/spree/admin/components/_badges.css +1 -1
  5. data/app/assets/tailwind/spree/admin/components/_breadcrumbs.css +1 -1
  6. data/app/assets/tailwind/spree/admin/components/_buttons.css +1 -1
  7. data/app/assets/tailwind/spree/admin/components/_cards.css +1 -1
  8. data/app/assets/tailwind/spree/admin/components/_dialogs.css +3 -1
  9. data/app/assets/tailwind/spree/admin/components/_dropdowns.css +2 -2
  10. data/app/assets/tailwind/spree/admin/components/_filters.css +1 -1
  11. data/app/assets/tailwind/spree/admin/components/_forms.css +10 -6
  12. data/app/assets/tailwind/spree/admin/components/_layout.css +30 -23
  13. data/app/assets/tailwind/spree/admin/components/_rtl.css +53 -0
  14. data/app/assets/tailwind/spree/admin/components/_search-picker.css +2 -2
  15. data/app/assets/tailwind/spree/admin/components/_tables.css +1 -1
  16. data/app/assets/tailwind/spree/admin/index.css +1 -0
  17. data/app/assets/tailwind/spree/admin/plugins/_tom-select.css +6 -6
  18. data/app/assets/tailwind/spree/admin/plugins/_trix.css +1 -1
  19. data/app/assets/tailwind/spree/admin/plugins/_uppy.css +1 -1
  20. data/app/assets/tailwind/spree/admin/views/_page-builder.css +8 -5
  21. data/app/controllers/concerns/spree/admin/locale_concern.rb +76 -0
  22. data/app/controllers/spree/admin/base_controller.rb +38 -2
  23. data/app/controllers/spree/admin/countries_controller.rb +18 -4
  24. data/app/controllers/spree/admin/exports_controller.rb +7 -0
  25. data/app/controllers/spree/admin/imports_controller.rb +8 -0
  26. data/app/controllers/spree/admin/products_controller.rb +1 -0
  27. data/app/controllers/spree/admin/storefront_controller.rb +100 -0
  28. data/app/controllers/spree/admin/user_sessions_controller.rb +10 -0
  29. data/app/controllers/spree/admin/variants_controller.rb +3 -1
  30. data/app/helpers/spree/admin/base_helper.rb +10 -0
  31. data/app/helpers/spree/admin/channels_helper.rb +17 -0
  32. data/app/helpers/spree/admin/dropdown_helper.rb +14 -0
  33. data/app/helpers/spree/admin/navigation_helper.rb +1 -1
  34. data/app/helpers/spree/admin/onboarding_helper.rb +1 -1
  35. data/app/helpers/spree/admin/orders_helper.rb +9 -34
  36. data/app/helpers/spree/admin/products_helper.rb +1 -1
  37. data/app/helpers/spree/admin/rtl_helper.rb +15 -0
  38. data/app/helpers/spree/admin/shipment_helper.rb +1 -1
  39. data/app/helpers/spree/admin/storefront_helper.rb +46 -0
  40. data/app/helpers/spree/admin/stores_helper.rb +2 -1
  41. data/app/javascript/spree/admin/application.js +2 -0
  42. data/app/javascript/spree/admin/controllers/autocomplete_select_controller.js +4 -0
  43. data/app/javascript/spree/admin/controllers/calendar_range_controller.js +7 -3
  44. data/app/javascript/spree/admin/controllers/display_name_controller.js +18 -0
  45. data/app/javascript/spree/admin/controllers/query_builder_controller.js +39 -28
  46. data/app/javascript/spree/admin/controllers/variants_form_controller.js +49 -1
  47. data/app/javascript/spree/admin/helpers/display_names.js +54 -0
  48. data/app/models/spree/admin/table/column.rb +15 -1
  49. data/app/models/spree/admin/table/filter.rb +23 -16
  50. data/app/models/spree/admin/table/query_builder.rb +11 -2
  51. data/app/views/active_storage/_upload_form.html.erb +1 -1
  52. data/app/views/layouts/spree/admin.html.erb +1 -1
  53. data/app/views/layouts/spree/admin_settings.html.erb +1 -1
  54. data/app/views/layouts/spree/admin_wizard.html.erb +2 -2
  55. data/app/views/layouts/spree/minimal.html.erb +1 -1
  56. data/app/views/spree/admin/admin_users/_audit_log.html.erb +2 -2
  57. data/app/views/spree/admin/admin_users/new.html.erb +1 -1
  58. data/app/views/spree/admin/assets/edit.html.erb +1 -1
  59. data/app/views/spree/admin/channels/_form.html.erb +10 -0
  60. data/app/views/spree/admin/dashboard/_setup_progress.html.erb +4 -4
  61. data/app/views/spree/admin/dashboard/_setup_tasks.html.erb +5 -4
  62. data/app/views/spree/admin/dashboard/_updater.html.erb +4 -4
  63. data/app/views/spree/admin/dashboard/_visits.html.erb +12 -12
  64. data/app/views/spree/admin/dashboard/analytics.html.erb +5 -5
  65. data/app/views/spree/admin/dashboard/setup_tasks/_add_products.html.erb +4 -4
  66. data/app/views/spree/admin/dashboard/setup_tasks/_set_customer_support_email.html.erb +3 -4
  67. data/app/views/spree/admin/dashboard/setup_tasks/_setup_storefront.html.erb +18 -0
  68. data/app/views/spree/admin/gift_card_batches/_form.html.erb +1 -1
  69. data/app/views/spree/admin/import_rows/show.html.erb +2 -2
  70. data/app/views/spree/admin/imports/_footer.html.erb +1 -1
  71. data/app/views/spree/admin/imports/_mapping_form.html.erb +1 -1
  72. data/app/views/spree/admin/imports/show.html.erb +3 -3
  73. data/app/views/spree/admin/integrations/_integration.html.erb +1 -1
  74. data/app/views/spree/admin/integrations/index.html.erb +2 -4
  75. data/app/views/spree/admin/invitations/_invitation.html.erb +1 -1
  76. data/app/views/spree/admin/invitations/new.html.erb +1 -1
  77. data/app/views/spree/admin/invitations/show.html.erb +1 -1
  78. data/app/views/spree/admin/line_items/new.html.erb +1 -1
  79. data/app/views/spree/admin/markets/_form.html.erb +8 -6
  80. data/app/views/spree/admin/metafields/edit.html.erb +1 -1
  81. data/app/views/spree/admin/option_types/_form.html.erb +9 -6
  82. data/app/views/spree/admin/option_types/index.html.erb +2 -3
  83. data/app/views/spree/admin/orders/_customer.html.erb +1 -1
  84. data/app/views/spree/admin/orders/_customer_summary.html.erb +1 -1
  85. data/app/views/spree/admin/orders/_payments.html.erb +1 -1
  86. data/app/views/spree/admin/orders/_shipment.html.erb +7 -2
  87. data/app/views/spree/admin/orders/_shipments.html.erb +1 -1
  88. data/app/views/spree/admin/orders/_user_overview.html.erb +9 -6
  89. data/app/views/spree/admin/orders/return_authorizations/edit.html.erb +1 -1
  90. data/app/views/spree/admin/payment_methods/_form.html.erb +1 -1
  91. data/app/views/spree/admin/payment_methods/index.html.erb +2 -2
  92. data/app/views/spree/admin/payments/_payment.html.erb +1 -1
  93. data/app/views/spree/admin/price_lists/index.html.erb +2 -2
  94. data/app/views/spree/admin/products/form/_inventory.html.erb +19 -0
  95. data/app/views/spree/admin/products/form/_publishing.html.erb +2 -3
  96. data/app/views/spree/admin/products/index.html.erb +1 -2
  97. data/app/views/spree/admin/profile/edit.html.erb +3 -0
  98. data/app/views/spree/admin/promotion_rules/forms/_channel.html.erb +7 -0
  99. data/app/views/spree/admin/promotion_rules/forms/_country.html.erb +1 -1
  100. data/app/views/spree/admin/promotion_rules/forms/_item_total.html.erb +1 -1
  101. data/app/views/spree/admin/promotion_rules/forms/_market.html.erb +7 -0
  102. data/app/views/spree/admin/promotions/_form.html.erb +2 -2
  103. data/app/views/spree/admin/promotions/_sidebar.html.erb +1 -1
  104. data/app/views/spree/admin/promotions/edit.html.erb +2 -2
  105. data/app/views/spree/admin/promotions/form/_kind.html.erb +11 -11
  106. data/app/views/spree/admin/promotions/form/_settings.html.erb +4 -5
  107. data/app/views/spree/admin/reports/new.html.erb +2 -2
  108. data/app/views/spree/admin/shared/_address.html.erb +1 -1
  109. data/app/views/spree/admin/shared/_analytics_loader_skeleton.html.erb +5 -5
  110. data/app/views/spree/admin/shared/_calendar_range_picker.html.erb +11 -1
  111. data/app/views/spree/admin/shared/_content_header.html.erb +2 -2
  112. data/app/views/spree/admin/shared/_edit_resource_links.html.erb +1 -1
  113. data/app/views/spree/admin/shared/_filters_search_bar.html.erb +1 -1
  114. data/app/views/spree/admin/shared/_growth_rate_badge.html.erb +1 -1
  115. data/app/views/spree/admin/shared/_head.html.erb +4 -1
  116. data/app/views/spree/admin/shared/_index_table_options.html.erb +2 -2
  117. data/app/views/spree/admin/shared/_media_asset.html.erb +1 -1
  118. data/app/views/spree/admin/shared/_media_form.html.erb +1 -1
  119. data/app/views/spree/admin/shared/_seo.html.erb +1 -1
  120. data/app/views/spree/admin/shared/_sidebar.html.erb +1 -1
  121. data/app/views/spree/admin/shared/sidebar/_enterprise_edition_notice.html.erb +2 -2
  122. data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +1 -1
  123. data/app/views/spree/admin/shipping_methods/form/_display.html.erb +2 -2
  124. data/app/views/spree/admin/shipping_methods/form/_estimated_transit_business_days.html.erb +1 -2
  125. data/app/views/spree/admin/shipping_methods/form/_tracking_url.html.erb +1 -1
  126. data/app/views/spree/admin/shipping_methods/form/_zones.html.erb +1 -1
  127. data/app/views/spree/admin/shipping_methods/index.html.erb +1 -1
  128. data/app/views/spree/admin/storefront/show.html.erb +150 -0
  129. data/app/views/spree/admin/stores/form/_basic.html.erb +2 -2
  130. data/app/views/spree/admin/stores/form/_checkout.html.erb +4 -0
  131. data/app/views/spree/admin/stores/form/_emails.html.erb +4 -6
  132. data/app/views/spree/admin/tables/_table.html.erb +3 -2
  133. data/app/views/spree/admin/taxons/_form.html.erb +2 -2
  134. data/app/views/spree/admin/user_sessions/new.html.erb +11 -2
  135. data/app/views/spree/admin/users/_tabs.html.erb +1 -1
  136. data/app/views/spree/admin/variants/_search_result.html.erb +1 -1
  137. data/app/views/spree/admin/variants/_variant.html.erb +1 -1
  138. data/app/views/spree/admin/variants/form/_inventory.html.erb +17 -0
  139. data/app/views/spree/admin/webhook_endpoints/_form.html.erb +2 -2
  140. data/app/views/spree/admin/zones/index.html.erb +1 -1
  141. data/config/i18n-tasks.yml +3 -0
  142. data/config/initializers/spree_admin_navigation.rb +9 -0
  143. data/config/initializers/spree_admin_tables.rb +20 -18
  144. data/config/locales/en.yml +647 -0
  145. data/config/routes.rb +5 -0
  146. metadata +18 -6
@@ -14,11 +14,11 @@
14
14
 
15
15
  <div class="card mb-6">
16
16
  <div class="card-header">
17
- <h5 class="card-title">Email addresses</h5>
17
+ <h5 class="card-title"><%= Spree.t('admin.store_form.email_addresses') %></h5>
18
18
  </div>
19
19
  <div class="card-body">
20
20
  <p class="text-gray-600">
21
- Please provide the email address that will be used as the sender of all emails sent from your store.
21
+ <%= Spree.t('admin.store_form.mail_from_address_help') %>
22
22
  </p>
23
23
 
24
24
  <%= f.spree_email_field :mail_from_address, required: true %>
@@ -32,12 +32,10 @@
32
32
  <h5 class="card-title"><%= Spree.t(:logo) %></h5>
33
33
  </div>
34
34
  <div class="card-body">
35
- <p class="text-gray-600">This logo is included in all email notifications such as order confirmation</p>
35
+ <p class="text-gray-600"><%= Spree.t('admin.store_form.mailer_logo_help') %></p>
36
36
  <%= f.spree_file_field :mailer_logo, width: 204, height: 104 %>
37
37
  <p class="form-text mb-0 mt-2">
38
- We recommend images with a transparent background.
39
- <br />
40
- Only JPEG and PNG formats are supported.
38
+ <%= Spree.t('admin.store_form.mailer_logo_format_hint') %>
41
39
  </p>
42
40
  </div>
43
41
  </div>
@@ -3,7 +3,8 @@
3
3
  <% columns = table.visible_columns(selected_columns, self) %>
4
4
  <% current_sort = params.dig(:q, :s) %>
5
5
  <% search_param = table.respond_to?(:search_param) ? table.search_param : :name_cont %>
6
- <% search_placeholder = (table.respond_to?(:search_placeholder) && table.search_placeholder) || [Spree.t(:search), controller_name.humanize.downcase].join(' ') %>
6
+ <% resource_name = table.model_class ? table.model_class.model_name.human(count: 2) : controller_name.humanize %>
7
+ <% search_placeholder = (table.respond_to?(:search_placeholder) && table.search_placeholder) || Spree.t('admin.search_placeholder', resource: resource_name) %>
7
8
  <% date_range_param = table.date_range_param %>
8
9
 
9
10
  <%= turbo_frame_tag frame_name, data: { turbo_action: 'advance' } do %>
@@ -15,7 +16,7 @@
15
16
  <div class="flex flex-col lg:flex-row gap-3 items-start lg:items-center justify-between">
16
17
  <div class="flex gap-2 items-center flex-wrap">
17
18
  <%= 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-[2rem] transition-all duration-100 ease-in-out">
19
+ <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] me-auto h-[2rem] transition-all duration-100 ease-in-out">
19
20
  <%= icon "search", class: "mr-4 text-gray-600 shrink-0" %>
20
21
  <%= search_field_tag "q[#{search_param}]",
21
22
  params.dig(:q, search_param),
@@ -85,7 +85,7 @@
85
85
  <%= f.spree_file_field :image, width: 1920, height: 1080 %>
86
86
  </div>
87
87
  <div class="card-body">
88
- <%= f.spree_file_field :square_image, width: 400, height: 400, crop: true, help: "Used for the featured image on the homepage." %>
88
+ <%= f.spree_file_field :square_image, width: 400, height: 400, crop: true, help: Spree.t('admin.taxons.square_image_help') %>
89
89
  </div>
90
90
  </div>
91
91
 
@@ -113,6 +113,6 @@
113
113
  slug_attribute_name: :permalink_part,
114
114
  slug: @permalink_part,
115
115
  slug_path: ['t', @parent_permalink.presence].compact.join('/'),
116
- placeholder: 'Add a title and description to see how this taxon might appear in a search engine listing' %>
116
+ placeholder: Spree.t('admin.taxons.seo.placeholder') %>
117
117
  </div>
118
118
  </div>
@@ -1,10 +1,10 @@
1
1
  <% content_for(:title, Spree.t(:login)) %>
2
2
 
3
- <h1 class="mb-4 font-light">Welcome back</h1>
3
+ <h1 class="mb-4 font-light"><%= Spree.t('admin.user_sessions.welcome_back') %></h1>
4
4
  <%= form_for resource, as: resource_name, url: session_path(resource_name), data: { controller: 'enable-button', turbo: false } do |f| %>
5
5
  <div class="form-group mb-4">
6
6
  <%= f.label :email, Spree.t(:email), required: true, class: 'form-label' %>
7
- <%= f.email_field :email, required: true, class: 'form-input form-input-lg', placeholder: 'steve@getvendo.com', data: { enable_button_target: :input }, autocomplete: :email, autofocus: true %>
7
+ <%= f.email_field :email, required: true, class: 'form-input form-input-lg', placeholder: Spree.t('admin.user_sessions.email_placeholder'), data: { enable_button_target: :input }, autocomplete: :email, autofocus: true %>
8
8
  </div>
9
9
  <div class="form-group mb-4">
10
10
  <%= f.label :password, Spree.t(:password), required: true, class: 'form-label' %>
@@ -14,3 +14,12 @@
14
14
  <%= turbo_save_button_tag Spree.t(:login), class: 'btn btn-primary btn-lg w-full' %>
15
15
  <% end %>
16
16
 
17
+ <% if admin_locales_options.many? %>
18
+ <%= form_tag new_session_path(resource_name), method: :get, class: 'form-group mt-4', data: { turbo: false } do %>
19
+ <%= label_tag :locale, Spree.t(:language), class: 'form-label' %>
20
+ <%= select_tag :locale,
21
+ options_for_select(admin_locales_options, params[:locale] || I18n.locale.to_s),
22
+ onchange: 'this.form.requestSubmit()', class: 'form-select' %>
23
+ <% end %>
24
+ <% end %>
25
+
@@ -2,7 +2,7 @@
2
2
  <ul class="nav nav-pills mb-4" role="tablist">
3
3
  <% if spree.respond_to?(:admin_user_visits_path) %>
4
4
  <li class="nav-item" role="presentation">
5
- <a class="nav-link active" id="pills-overview-tab" data-tabs-target="tab" data-action="click->tabs#select" role="tab" aria-controls="pills-overview" aria-selected="true">Timeline</a>
5
+ <a class="nav-link active" id="pills-overview-tab" data-tabs-target="tab" data-action="click->tabs#select" role="tab" aria-controls="pills-overview" aria-selected="true"><%= Spree.t('admin.users.timeline') %></a>
6
6
  </li>
7
7
  <% end %>
8
8
 
@@ -17,7 +17,7 @@
17
17
  <div class="w-20">
18
18
  <% if params[:stock_location_id].present? %>
19
19
  <% stock_item = variant.stock_items.find { |si| si.stock_location_id == params[:stock_location_id] } %>
20
- <span><%= stock_item&.count_on_hand || 0 %> at location</span>
20
+ <span><%= Spree.t('admin.variants.count_at_location', count: stock_item&.count_on_hand || 0) %></span>
21
21
  <% if stock_item&.backorderable? %> <span class="text-gray-600"><%= Spree.t(:backorderable) %></span><% end %>
22
22
  <% else %>
23
23
  <%= display_inventory(variant) %>
@@ -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: dom_id(variant, 'spree'), 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 gap-2' do %>
9
9
  <%= render "spree/admin/shared/product_image", object: variant %>
10
10
  <div class="ml-6">
11
11
  <strong><%= variant.name %></strong>
@@ -7,6 +7,23 @@
7
7
  <div class="card-body p-0" data-controller="reveal" data-reveal-hidden-class="hidden!">
8
8
  <div class="p-3">
9
9
  <%= f.spree_check_box :track_inventory, data: { action: 'change->reveal#toggle' } %>
10
+ <div class="mt-2">
11
+ <%= f.spree_check_box :preorderable, label: Spree.t('admin.variants_form.preorderable_label') %>
12
+ <small class="text-muted text-xs d-block"><%= Spree.t('admin.variants_form.preorderable_hint') %></small>
13
+ </div>
14
+ <div class="mt-2">
15
+ <%# datetime-local inputs have no timezone; render in the store's timezone so admins see and submit store-local times (parsed back in VariantsController#permitted_resource_params). %>
16
+ <% preorder_ships_at_local = f.object.preorder_ships_at&.in_time_zone(current_timezone)&.strftime('%Y-%m-%dT%H:%M') %>
17
+ <%= f.spree_datetime_field :preorder_ships_at,
18
+ value: preorder_ships_at_local,
19
+ label: Spree.t('admin.variants_form.preorder_ships_at_label'),
20
+ help: "#{Spree.t('admin.variants_form.preorder_ships_at_hint')} #{Spree.t('admin.datetime_field_timezone_help', zone: current_timezone.name)}" %>
21
+ </div>
22
+ <div class="mt-2">
23
+ <%= f.spree_number_field :backorder_limit, min: 0,
24
+ label: Spree.t('admin.variants_form.backorder_limit_label'),
25
+ help: Spree.t('admin.variants_form.backorder_limit_hint') %>
26
+ </div>
10
27
  </div>
11
28
 
12
29
  <table class="table border-t <%= 'hidden!' unless f.object.track_inventory? %>" data-reveal-target="item">
@@ -3,8 +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 :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' %>
6
+ <%= f.spree_text_field :name, placeholder: Spree.t('admin.webhook_endpoints.name_placeholder') %>
7
+ <%= f.spree_text_field :url, required: true, autofocus: f.object.new_record?, placeholder: Spree.t('admin.webhook_endpoints.url_placeholder') %>
8
8
  <%= f.spree_check_box :active %>
9
9
  </div>
10
10
  </div>
@@ -9,7 +9,7 @@
9
9
 
10
10
  <% content_for :page_alerts do %>
11
11
  <div class="alert alert-info">
12
- Zones are geographical groupings, they represent collections of either states or countries.
12
+ <%= Spree.t('admin.zones.info') %>
13
13
  </div>
14
14
  <% end %>
15
15
 
@@ -156,9 +156,12 @@ ignore_unused:
156
156
  - 'spree.admin.bulk_ops.users.title.*'
157
157
  - 'spree.admin.display_on_options.*'
158
158
  - 'spree.admin.order.events.*'
159
+ - 'spree.admin.orders.avs_responses.*'
160
+ - 'spree.admin.orders.cvv_responses.*'
159
161
  - 'spree.admin.orders.no_email_present'
160
162
  - 'spree.admin.orders.payment_link_sent'
161
163
  - 'spree.admin.store_setup_tasks.*'
164
+ - 'spree.admin.table.operators.*'
162
165
  - 'spree.admin.taxon_rules.*'
163
166
  - 'spree.admin.webhooks_subscribers.*'
164
167
 
@@ -251,6 +251,15 @@ Rails.application.config.after_initialize do
251
251
  active: -> { controller_name == 'policies' },
252
252
  if: -> { can?(:manage, Spree::Policy) }
253
253
 
254
+ # Storefront setup
255
+ settings_nav.add :storefront,
256
+ label: 'admin.storefront',
257
+ url: :admin_storefront_path,
258
+ icon: 'building-store',
259
+ position: 60,
260
+ active: -> { controller_name == 'storefront' },
261
+ if: -> { can?(:update, current_store) }
262
+
254
263
  # Channels
255
264
  settings_nav.add :channels,
256
265
  label: :channels,
@@ -35,9 +35,9 @@ Rails.application.config.after_initialize do
35
35
  position: 20,
36
36
  partial: 'spree/admin/tables/columns/product_status',
37
37
  value_options: [
38
- { value: 'draft', label: 'Draft' },
39
- { value: 'active', label: 'Active' },
40
- { value: 'archived', label: 'Archived' }
38
+ { value: 'draft', label: 'admin.products.draft' },
39
+ { value: 'active', label: 'admin.products.active' },
40
+ { value: 'archived', label: 'admin.products.archived' }
41
41
  ]
42
42
 
43
43
  # Inventory display (custom partial)
@@ -90,7 +90,7 @@ Rails.application.config.after_initialize do
90
90
 
91
91
  # Stock filter (filter-only, not displayed as column)
92
92
  Spree.admin.tables.products.add :in_stock,
93
- label: 'In Stock',
93
+ label: 'admin.products.in_stock',
94
94
  type: :boolean,
95
95
  filter_type: :boolean,
96
96
  sortable: false,
@@ -293,7 +293,7 @@ Rails.application.config.after_initialize do
293
293
  default: false,
294
294
  position: 90,
295
295
  operators: %i[eq not_eq in not_in],
296
- value_options: -> { Spree::Order.state_machine(:state).states.map { |s| { value: s.name.to_s, label: s.name.to_s.humanize } } }
296
+ value_options: -> { Spree::Order.state_machine(:state).states.map { |s| { value: s.name.to_s, label: Spree.t("state_machine_states.#{s.name}", default: s.name.to_s.humanize) } } }
297
297
 
298
298
  Spree.admin.tables.orders.add :email,
299
299
  label: :email,
@@ -414,7 +414,7 @@ Rails.application.config.after_initialize do
414
414
  default: true,
415
415
  position: 40,
416
416
  operators: %i[eq not_eq in not_in],
417
- value_options: -> { Spree::Order.state_machine(:state).states.map { |s| { value: s.name.to_s, label: s.name.to_s.humanize } } }
417
+ value_options: -> { Spree::Order.state_machine(:state).states.map { |s| { value: s.name.to_s, label: Spree.t("state_machine_states.#{s.name}", default: s.name.to_s.humanize) } } }
418
418
 
419
419
  Spree.admin.tables.checkouts.add :item_count,
420
420
  label: :item_count,
@@ -489,6 +489,7 @@ Rails.application.config.after_initialize do
489
489
  ransack_attribute: 'addresses_country_name',
490
490
  operators: %i[eq],
491
491
  search_url: ->(view_context) { view_context.spree.select_options_admin_countries_path(format: :json) },
492
+ preload_options: true,
492
493
  partial: 'spree/admin/tables/columns/user_location'
493
494
 
494
495
  # Number of orders
@@ -1295,8 +1296,8 @@ Rails.application.config.after_initialize do
1295
1296
  position: 20,
1296
1297
  filter_type: :select,
1297
1298
  value_options: [
1298
- { value: 'true', label: 'Active' },
1299
- { value: 'false', label: 'Inactive' }
1299
+ { value: 'true', label: 'price_list_statuses.active' },
1300
+ { value: 'false', label: 'price_list_statuses.inactive' }
1300
1301
  ]
1301
1302
 
1302
1303
  Spree.admin.tables.webhook_endpoints.add :health,
@@ -1439,8 +1440,8 @@ Rails.application.config.after_initialize do
1439
1440
  partial: 'spree/admin/tables/columns/api_key_type',
1440
1441
  filter_type: :select,
1441
1442
  value_options: [
1442
- { value: 'publishable', label: 'Publishable' },
1443
- { value: 'secret', label: 'Secret' }
1443
+ { value: 'publishable', label: 'admin.api_keys.key_types.publishable' },
1444
+ { value: 'secret', label: 'admin.api_keys.key_types.secret' }
1444
1445
  ]
1445
1446
 
1446
1447
  Spree.admin.tables.api_keys.add :status,
@@ -1499,10 +1500,10 @@ Rails.application.config.after_initialize do
1499
1500
  position: 20,
1500
1501
  partial: 'spree/admin/tables/columns/price_list_status',
1501
1502
  value_options: [
1502
- { value: 'draft', label: 'Draft' },
1503
- { value: 'active', label: 'Active' },
1504
- { value: 'scheduled', label: 'Scheduled' },
1505
- { value: 'inactive', label: 'Inactive' }
1503
+ { value: 'draft', label: 'price_list_statuses.draft' },
1504
+ { value: 'active', label: 'price_list_statuses.active' },
1505
+ { value: 'scheduled', label: 'price_list_statuses.scheduled' },
1506
+ { value: 'inactive', label: 'price_list_statuses.inactive' }
1506
1507
  ]
1507
1508
 
1508
1509
  Spree.admin.tables.price_lists.add :starts_at,
@@ -1561,7 +1562,7 @@ Rails.application.config.after_initialize do
1561
1562
  position: 20,
1562
1563
  partial: 'spree/admin/tables/columns/product_status',
1563
1564
  ransack_attribute: 'status',
1564
- value_options: -> { Spree::Product::STATUSES.map { |s| { value: s, label: s.humanize } } }
1565
+ value_options: -> { Spree::Product::STATUSES.map { |s| { value: s, label: Spree.t("admin.products.#{s}", default: s.humanize) } } }
1565
1566
 
1566
1567
  Spree.admin.tables.price_list_products.add :inventory,
1567
1568
  label: :inventory,
@@ -1713,7 +1714,8 @@ Rails.application.config.after_initialize do
1713
1714
  type: :string,
1714
1715
  sortable: true,
1715
1716
  default: true,
1716
- position: 30
1717
+ position: 30,
1718
+ format: 'locale_display_label'
1717
1719
 
1718
1720
  Spree.admin.tables.markets.add :default,
1719
1721
  label: :default,
@@ -1745,8 +1747,8 @@ Rails.application.config.after_initialize do
1745
1747
  default: true,
1746
1748
  position: 20,
1747
1749
  value_options: [
1748
- { value: 'unused', label: 'Unused' },
1749
- { value: 'used', label: 'Used' }
1750
+ { value: 'unused', label: 'admin.coupon_codes.unused' },
1751
+ { value: 'used', label: 'admin.coupon_codes.used' }
1750
1752
  ]
1751
1753
 
1752
1754
  Spree.admin.tables.coupon_codes.add :created_at,