spree_admin 5.1.0 → 5.1.2

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/spree/admin/components/_buttons.scss +1 -1
  3. data/app/assets/stylesheets/spree/admin/components/_main.scss +46 -0
  4. data/app/controllers/spree/admin/dashboard_controller.rb +6 -0
  5. data/app/controllers/spree/admin/digital_assets_controller.rb +1 -0
  6. data/app/controllers/spree/admin/reports_controller.rb +14 -2
  7. data/app/controllers/spree/admin/storefront_controller.rb +1 -1
  8. data/app/helpers/spree/admin/base_helper.rb +10 -4
  9. data/app/helpers/spree/admin/orders_filters_helper.rb +5 -4
  10. data/app/helpers/spree/admin/products_helper.rb +1 -1
  11. data/app/javascript/spree/admin/controllers/calendar_range_controller.js +1 -0
  12. data/app/models/spree/admin/updater.rb +9 -5
  13. data/app/views/spree/admin/admin_users/show.html.erb +1 -1
  14. data/app/views/spree/admin/dashboard/_updater.html.erb +15 -5
  15. data/app/views/spree/admin/dashboard/getting_started.html.erb +1 -3
  16. data/app/views/spree/admin/dashboard/show.html.erb +2 -2
  17. data/app/views/spree/admin/integrations/index.html.erb +16 -16
  18. data/app/views/spree/admin/pages/index.html.erb +2 -1
  19. data/app/views/spree/admin/payment_methods/_form.html.erb +47 -54
  20. data/app/views/spree/admin/payment_methods/edit.html.erb +7 -3
  21. data/app/views/spree/admin/payment_methods/new.html.erb +7 -4
  22. data/app/views/spree/admin/products/form/_base.html.erb +1 -1
  23. data/app/views/spree/admin/profile/edit.html.erb +6 -8
  24. data/app/views/spree/admin/promotions/new.html.erb +51 -5
  25. data/app/views/spree/admin/shared/_content_header.html.erb +3 -3
  26. data/app/views/spree/admin/shared/_head.html.erb +1 -0
  27. data/app/views/spree/admin/shared/_stock_nav.html.erb +2 -4
  28. data/app/views/spree/admin/shared/sidebar/_enterprise_edition_notice.html.erb +1 -1
  29. data/app/views/spree/admin/storefront/edit.html.erb +6 -6
  30. data/app/views/spree/admin/stores/edit.html.erb +0 -1
  31. data/app/views/spree/admin/stores/form/_checkout.html.erb +20 -24
  32. data/app/views/spree/admin/stores/form/_emails.html.erb +16 -18
  33. data/app/views/spree/admin/translations/edit.html.erb +4 -4
  34. data/app/views/spree/admin/translations/option_types/_form.html.erb +5 -1
  35. data/app/views/spree/admin/translations/products/_form.html.erb +1 -3
  36. data/app/views/spree/admin/translations/translation_rows/_permalink_field_row.html.erb +4 -12
  37. data/app/views/spree/admin/translations/translation_rows/_rich_textarea_row.html.erb +2 -2
  38. data/app/views/spree/admin/translations/translation_rows/_text_field_row.html.erb +1 -1
  39. data/app/views/spree/admin/translations/translation_rows/_textarea_row.html.erb +2 -2
  40. data/app/views/spree/admin/translations/translation_rows/_tinymce_row.html.erb +13 -0
  41. data/app/views/spree/admin/variants/edit.html.erb +3 -6
  42. data/app/views/spree/admin/variants/form/_inventory.html.erb +12 -2
  43. data/config/routes.rb +2 -1
  44. data/lib/spree/admin/testing_support/capybara_utils.rb +0 -4
  45. metadata +9 -9
  46. data/app/views/spree/admin/promotions/_form.html.erb +0 -47
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c11ae8c30724208b7082248ce95459e064dc46464cf0f984f8890f6f6fb3d5c6
4
- data.tar.gz: 0ae40837806e61a1c1b871cf07be224b2027fc35511afb150a015bb32330d551
3
+ metadata.gz: 38049374f6d7f79407c48dfcf500d7fdc68d33066be7a19aa9ed6d43097f0251
4
+ data.tar.gz: 3b6da7a55d29b372f6e1ea85550eb83834a85220b3386f3168ecd551a892b2b7
5
5
  SHA512:
6
- metadata.gz: 846341ef938847490b94ab25fc12028e6feeb7ef108976eb290a28ff5f3a6abc90d1fc4720b04cbe0b5bce8b7f6331d79957b333c10d4b49feeb4e7403e90d46
7
- data.tar.gz: af23c0940838885d2225a883992e1761acbd17a910e9a90dd5627a2d638a1b377ef72ab87e1bfeaf488deca193d60aab74d0a86c28a2a77aa5d2ea1d2e089fae
6
+ metadata.gz: 5f7a0c8b6512c468a00bcbbe83d674191984292b00349a2cdafd1fc2f4ab1213f839a9a2bc2e3901811f4bc3ff880f338892e7a6d0e02ae772bad0cf27a36cd9
7
+ data.tar.gz: 1177771475c2b570e542146d1e2e860bf11fe6960cd4ee5e46f2d8022abba0c52f8036b95a393d004183d9f68a30ef849a8c0f50d505f83dcf2aa631790dbc87
@@ -131,7 +131,7 @@ button[disabled] .show-when-enabled { display: none; }
131
131
 
132
132
  &:hover {
133
133
  opacity: 0.8 !important;
134
- background-color: $gray-100 !important;
134
+ background-color: $gray-50 !important;
135
135
  }
136
136
  }
137
137
 
@@ -25,6 +25,37 @@
25
25
  font-size: 1.25rem;
26
26
  }
27
27
 
28
+ #page-tabs {
29
+ border-bottom: 1px solid $border-color;
30
+ margin-bottom: 1rem;
31
+ padding-left: 1.5rem;
32
+ padding-right: 1.5rem;
33
+ margin-top: -1rem;
34
+
35
+ .nav {
36
+ gap: 1rem;
37
+ display: flex;
38
+ flex-wrap: nowrap;
39
+ overflow-x: auto;
40
+ padding-left: 0;
41
+ margin-bottom: -1px;
42
+
43
+ .nav-link {
44
+ border-radius: 0;
45
+ padding-bottom: 1rem;
46
+ padding-top: 1rem;
47
+ padding-left: 0rem;
48
+ padding-right: 0rem;
49
+
50
+ &.active {
51
+ background-color: transparent;
52
+ color: theme-color('primary');
53
+ font-weight: 600;
54
+ }
55
+ }
56
+ }
57
+ }
58
+
28
59
  .store-dropdown {
29
60
  display: flex;
30
61
  align-items: center;
@@ -245,6 +276,21 @@
245
276
  }
246
277
  }
247
278
 
279
+ #updater-notice {
280
+ background-color: $white;
281
+ width: 100%;
282
+ display: flex;
283
+ flex-direction: row;
284
+ gap: 1rem;
285
+ justify-content: flex-start;
286
+ align-items: center;
287
+ padding: 0.5rem 0.5rem;
288
+ border: 1px solid $border-color;
289
+ border-radius: $border-radius-lg;
290
+ box-shadow: $box-shadow-xs;
291
+ }
292
+
293
+
248
294
  .documentation-link-container {
249
295
  font-size: $font-size-sm;
250
296
  text-align: center;
@@ -64,6 +64,12 @@ module Spree
64
64
  redirect_back(fallback_location: spree.admin_dashboard_path)
65
65
  end
66
66
 
67
+ # PATCH /admin/dashboard/dismiss_updater_notice
68
+ def dismiss_updater_notice
69
+ session[:spree_updater_notice_dismissed] = { value: true, expires_at: 7.days.from_now }
70
+ redirect_back(fallback_location: spree.admin_dashboard_path)
71
+ end
72
+
67
73
  private
68
74
 
69
75
  def load_vendor
@@ -46,6 +46,7 @@ module Spree
46
46
  end
47
47
 
48
48
  def add_breadcrumbs
49
+ add_breadcrumb @product.name, spree.edit_admin_product_path(@product)
49
50
  add_breadcrumb Spree.t(:digital_assets), spree.admin_product_digital_assets_path(@product)
50
51
  end
51
52
  end
@@ -31,7 +31,10 @@ module Spree
31
31
  end
32
32
 
33
33
  def build_resource
34
- model_class.new(store: current_store, date_from: params[:date_from], date_to: params[:date_to], currency: params[:currency])
34
+ model_class.new(store: current_store,
35
+ date_from: parse_date_param(params[:date_from]),
36
+ date_to: parse_date_param(params[:date_to])&.end_of_day,
37
+ currency: params[:currency])
35
38
  end
36
39
 
37
40
  def model_class
@@ -55,7 +58,16 @@ module Spree
55
58
  end
56
59
 
57
60
  def permitted_resource_params
58
- params.require(:report).permit(permitted_report_attributes)
61
+ attributes = params.require(:report).permit(permitted_report_attributes)
62
+ attributes[:date_from] = parse_date_param(attributes[:date_from]) if attributes[:date_from].present?
63
+ attributes[:date_to] = parse_date_param(attributes[:date_to])&.end_of_day if attributes[:date_to].present?
64
+ attributes
65
+ end
66
+
67
+ def parse_date_param(date_string)
68
+ return if date_string.blank?
69
+
70
+ date_string.to_date&.in_time_zone(current_timezone)
59
71
  end
60
72
  end
61
73
  end
@@ -29,7 +29,7 @@ module Spree
29
29
  :meta_description, :meta_title, :meta_keywords, :seo_robots,
30
30
  :facebook, :twitter, :instagram, :linkedin, :youtube, :tiktok, :pinterest,
31
31
  :storefront_custom_code_head, :storefront_custom_code_body_start,
32
- :storefront_custom_code_body_end, :storefront_password
32
+ :storefront_custom_code_body_end, :storefront_password, :spotify, :discord
33
33
  )
34
34
  end
35
35
 
@@ -13,6 +13,7 @@ module Spree
13
13
  defined?(SpreeEnterprise)
14
14
  end
15
15
 
16
+ # @return [Spree::Admin::Updater] the spree updater
16
17
  def spree_updater
17
18
  @spree_updater ||= Spree::Admin::Updater
18
19
  end
@@ -21,6 +22,15 @@ module Spree
21
22
  @spree_update_available ||= !Rails.env.test? && spree_updater.update_available?
22
23
  end
23
24
 
25
+ def updater_notice_dismissed?
26
+ dismissal_data = session[:spree_updater_notice_dismissed]
27
+ dismissal_data.is_a?(Hash) && dismissal_data['expires_at'].to_time > Time.current
28
+ end
29
+
30
+ def show_spree_updater_notice?
31
+ Spree::Admin::RuntimeConfig.admin_updater_enabled && can?(:manage, current_store) && spree_update_available? && !updater_notice_dismissed?
32
+ end
33
+
24
34
  # check if the current controller is a settings controller
25
35
  # this is used to display different sidebar navigation for settings pages
26
36
  # @return [Boolean]
@@ -233,10 +243,6 @@ module Spree
233
243
  end
234
244
  end
235
245
 
236
- def spree_dom_id(record)
237
- dom_id(record, 'spree')
238
- end
239
-
240
246
  # renders a red dot with a * to indicate that a field is required
241
247
  # @return [String] the required span tag
242
248
  def required_span_tag
@@ -14,7 +14,8 @@ module Spree
14
14
 
15
15
  if search_params[:created_at_gt].present?
16
16
  search_params[:created_at_gt] = begin
17
- Time.zone.parse(search_params[:created_at_gt]).beginning_of_day
17
+ # Firstly we parse to date to avoid issues with timezones because frontend sends time in local timezone
18
+ search_params[:created_at_gt].to_date&.in_time_zone(current_timezone)
18
19
  rescue StandardError
19
20
  ''
20
21
  end
@@ -22,7 +23,7 @@ module Spree
22
23
 
23
24
  if search_params[:created_at_lt].present?
24
25
  search_params[:created_at_lt] = begin
25
- Time.zone.parse(search_params[:created_at_lt]).end_of_day
26
+ search_params[:created_at_lt].to_date&.in_time_zone(current_timezone)&.end_of_day
26
27
  rescue StandardError
27
28
  ''
28
29
  end
@@ -30,7 +31,7 @@ module Spree
30
31
 
31
32
  if search_params[:completed_at_gt].present?
32
33
  search_params[:completed_at_gt] = begin
33
- Time.zone.parse(search_params[:completed_at_gt]).beginning_of_day
34
+ search_params[:completed_at_gt].to_date&.in_time_zone(current_timezone)
34
35
  rescue StandardError
35
36
  ''
36
37
  end
@@ -38,7 +39,7 @@ module Spree
38
39
 
39
40
  if search_params[:completed_at_lt].present?
40
41
  search_params[:completed_at_lt] = begin
41
- Time.zone.parse(search_params[:completed_at_lt]).end_of_day
42
+ search_params[:completed_at_lt].to_date&.in_time_zone(current_timezone)&.end_of_day
42
43
  rescue StandardError
43
44
  ''
44
45
  end
@@ -124,7 +124,7 @@ module Spree
124
124
  end
125
125
 
126
126
  def sorted_product_properties(product)
127
- product.product_properties.includes(:property).sort_by { |product_property| product_property.property.position }
127
+ product.product_properties.sort_by { |product_property| product_property.property.position }
128
128
  end
129
129
  end
130
130
  end
@@ -28,6 +28,7 @@ export default class extends Controller {
28
28
  'This Month', 'Last Month'],
29
29
  position: 'left'
30
30
  },
31
+ lang: Spree.locale
31
32
  })
32
33
 
33
34
  this.picker.on('render', () => {
@@ -5,7 +5,7 @@ require 'uri'
5
5
  module Spree
6
6
  module Admin
7
7
  class Updater
8
- SPREE_CLOUD_UPDATES_URL = 'https://spreecloud.io/updates.json'
8
+ SPREE_CLOUD_UPDATES_URL = 'https://spreecloud.io/updates.json'.freeze
9
9
 
10
10
  @updates = nil
11
11
 
@@ -13,14 +13,18 @@ module Spree
13
13
  fetch_updates.any?
14
14
  end
15
15
 
16
- def self.latest_version
17
- @latest_version ||= fetch_updates.first&.dig('version')
16
+ def self.latest_release
17
+ @latest_release ||= fetch_updates.first
18
+ end
19
+
20
+ def self.current_release
21
+ @current_release ||= Spree.version
18
22
  end
19
23
 
20
24
  def self.fetch_updates
21
- @updates ||= Rails.cache.fetch("spree/admin/updater/fetch_updates/#{Spree.version}", expires_in: 1.day) do
25
+ @updates ||= Rails.cache.fetch("spree/admin/updater/fetch_updates/#{current_release}", expires_in: 1.day) do
22
26
  uri = URI(SPREE_CLOUD_UPDATES_URL)
23
- params = { version: Spree.version, environment: Rails.env, url: Spree::Store.current.url_or_custom_domain }
27
+ params = { version: current_release, environment: Rails.env, url: Spree::Store.current.url_or_custom_domain }
24
28
  uri.query = URI.encode_www_form(params)
25
29
 
26
30
  http = Net::HTTP.new(uri.host, uri.port)
@@ -13,7 +13,7 @@
13
13
  <div class="card-header">
14
14
  <h5 class="card-title">
15
15
  <%= icon 'history', class: 'mr-1' %>
16
- <%= Spree.t(:audit_log) %>
16
+ <%= Spree.t('admin.audit_log') %>
17
17
  </h5>
18
18
  </div>
19
19
  <div class="card-body">
@@ -1,9 +1,19 @@
1
- <% if Spree::Admin::RuntimeConfig.admin_updater_enabled && can?(:manage, current_store) && spree_update_available? %>
2
- <div class="alert alert-info">
3
- <div>
4
- <p class="mb-1">There's a newer version of Spree available.</p>
1
+ <% if show_spree_updater_notice? %>
2
+ <div id="updater-notice" class="mb-3">
3
+ <%= image_tag 'favicon_256x256.png', alt: 'Spree', width: 32, height: 32 %>
4
+ <div class="d-flex flex-column">
5
+ <p class="mb-1">
6
+ <strong>Spree <%= spree_updater.latest_release['name'] %></strong> is available.
7
+ <br />Your current version is <strong>Spree <%= spree_updater.current_release %></strong>.
8
+ </p>
5
9
 
6
- <%= link_to_with_icon 'settings-up', 'Update now', 'https://spreecommerce.org/docs/developer/upgrades', target: '_blank', class: 'btn btn-light btn-sm' %>
10
+ <% if spree_updater.latest_release['url'] %>
11
+ <div>
12
+ <%= external_link_to "View release notes", spree_updater.latest_release['url'], target: '_blank', class: 'btn btn-sm btn-link' %>
13
+ </div>
14
+ <% end %>
7
15
  </div>
16
+
17
+ <%= link_to '', spree.admin_dismiss_updater_notice_path, data: { turbo_method: :patch }, class: 'btn-close ml-auto' %>
8
18
  </div>
9
19
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <div class="row pt-3">
2
- <div class="col-lg-8 mb-4">
2
+ <div class="col-lg-8 offset-lg-2 mb-4">
3
3
  <h2 class="page-header-title">
4
4
  <%= Spree.t('admin.getting_started') %>
5
5
  </h2>
@@ -17,6 +17,4 @@
17
17
  <% end %>
18
18
  <% end %>
19
19
  </div>
20
- <div class="col-lg-4">
21
- </div>
22
20
  </div>
@@ -15,8 +15,8 @@
15
15
  <%= form_tag spree.admin_dashboard_analytics_path, method: :get, data: { turbo_frame: :analytics } do %>
16
16
  <%= hidden_field_tag :vendor_id, @vendor.id if @vendor.present? %>
17
17
  <%= render 'spree/admin/shared/calendar_range_picker',
18
- date_from_value: params[:date_from] || 1.month.ago.beginning_of_month,
19
- date_to_value: params[:date_to] || 1.month.ago.end_of_month,
18
+ date_from_value: params[:date_from] || 1.month.ago.end_of_day,
19
+ date_to_value: params[:date_to] || Time.zone.now.beginning_of_day,
20
20
  css_classes: "btn btn-sm border rounded-lg hover-light d-inline-flex align-items-center h-100 dropdown-toggle" %>
21
21
  <% end %>
22
22
  </div>
@@ -2,22 +2,22 @@
2
2
  <%= Spree.t(:integrations) %>
3
3
  <% end %>
4
4
 
5
- <%= content_for(:page_alerts) do %>
6
- <div class="alert alert-info">
7
- <%= Spree.t('admin.integrations.page_subtitle') %>
8
- </div>
9
- <% end %>
10
-
11
- <div class="container px-lg-0 mt-2">
12
- <% grouped_available_store_integrations.each do |group, integrations| %>
13
- <% if group.present? %>
14
- <div class="my-2 text-muted font-weight-light text-uppercase"><%= Spree.t(group) %></div>
15
- <% end %>
5
+ <div class="row">
6
+ <div class="col-lg-8 offset-lg-2">
7
+ <div class="alert alert-info mb-4">
8
+ <%= Spree.t('admin.integrations.page_subtitle') %>
9
+ </div>
16
10
 
17
- <div class="row row-cols-1 row-cols-md-2 row-cols-lg-4 mb-4">
18
- <% integrations.each do |integration| %>
19
- <%= render 'spree/admin/integrations/integration', integration_class: integration %>
11
+ <% grouped_available_store_integrations.each do |group, integrations| %>
12
+ <% if group.present? %>
13
+ <div class="my-2 text-muted font-weight-light text-uppercase"><%= Spree.t(group) %></div>
20
14
  <% end %>
21
- </div>
22
- <% end %>
15
+
16
+ <div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 mb-4">
17
+ <% integrations.each do |integration| %>
18
+ <%= render 'spree/admin/integrations/integration', integration_class: integration %>
19
+ <% end %>
20
+ </div>
21
+ <% end %>
22
+ </div>
23
23
  </div>
@@ -19,7 +19,8 @@
19
19
  </tr>
20
20
  </thead>
21
21
  <tbody>
22
- <%= render collection: @collection, partial: "spree/admin/pages/page", cached: spree_base_cache_scope %>
22
+ <% default_theme = current_store.default_theme %>
23
+ <%= render collection: @collection, partial: "spree/admin/pages/page", cached: ->(page) { [*spree_base_cache_scope.call(page), default_theme] } %>
23
24
  </tbody>
24
25
  </table>
25
26
  <%= render "spree/admin/shared/index_table_options", collection: @collection %>
@@ -2,69 +2,62 @@
2
2
  <%= render "spree/admin/payment_methods/configuration_guides/#{@object.configuration_guide_partial_name}", f: f %>
3
3
  <% end %>
4
4
 
5
+ <% if !preference_fields(@object, f).empty? || @object.respond_to?(:custom_form_fields_partial_name) %>
6
+ <div class="card mb-4">
7
+ <div class="card-header">
8
+ <h5 class="card-title"><%= Spree.t(:payment_provider_settings) %></h5>
9
+ </div>
10
+ <div class="card-body">
11
+ <%= preference_fields(@object, f) unless preference_fields(@object, f).empty? %>
5
12
 
6
- <div class="row">
7
- <% if !preference_fields(@object, f).empty? || @object.respond_to?(:custom_form_fields_partial_name) %>
8
- <div class="col-12 col-md-6">
9
- <div class="card mb-4">
10
- <div class="card-header">
11
- <h5 class="card-title"><%= Spree.t(:payment_provider_settings) %></h5>
12
- </div>
13
- <div class="card-body">
14
- <%= preference_fields(@object, f) unless preference_fields(@object, f).empty? %>
15
-
16
- <% if @object.respond_to?(:custom_form_fields_partial_name) %>
17
- <%= render "spree/admin/payment_methods/custom_form_fields/#{@object.custom_form_fields_partial_name}", f: f %>
18
- <% end %>
19
- </div>
20
- </div>
13
+ <% if @object.respond_to?(:custom_form_fields_partial_name) %>
14
+ <%= render "spree/admin/payment_methods/custom_form_fields/#{@object.custom_form_fields_partial_name}", f: f %>
15
+ <% end %>
21
16
  </div>
22
- <% end %>
17
+ </div>
18
+ <% end %>
23
19
 
24
- <div class="col-12 col-md-6">
25
- <div class="card mb-4">
26
- <div class="card-header">
27
- <h5 class="card-title"><%= Spree.t(:display_settings) %></h5>
28
- </div>
29
- <div class="card-body">
30
- <div class="form-group">
31
- <%= label_tag :payment_method_name, Spree.t(:name) %>
32
- <%= text_field :payment_method, :name, class: 'form-control' %>
33
- <span class="text-muted form-text mt-2">
34
- This name will be used to identify the payment method on the storefront
35
- </span>
20
+ <div class="card mb-4">
21
+ <div class="card-header">
22
+ <h5 class="card-title"><%= Spree.t(:display_settings) %></h5>
23
+ </div>
24
+ <div class="card-body">
25
+ <div class="form-group">
26
+ <%= label_tag :payment_method_name, Spree.t(:name) %>
27
+ <%= text_field :payment_method, :name, class: 'form-control' %>
28
+ <span class="text-muted form-text mt-2">
29
+ This name will be used to identify the payment method on the storefront
30
+ </span>
36
31
 
37
- <%= error_message_on :payment_method, :name %>
38
- </div>
32
+ <%= error_message_on :payment_method, :name %>
33
+ </div>
39
34
 
40
- <% if can?(:manage, Spree::Store) && available_stores.count > 1 %>
41
- <div class="form-group">
42
- <%= label_tag :payment_method_stores, Spree.t(:stores) %>
43
- <%= f.collection_check_boxes :store_ids, available_stores, :id, :name do |b| %>
44
- <div class="custom-control custom-checkbox mb-1">
45
- <%= b.check_box(class: 'custom-control-input') %>
46
- <%= b.label(class: 'custom-control-label') %>
47
- </div>
48
- <% end %>
35
+ <% if can?(:manage, Spree::Store) && available_stores.count > 1 %>
36
+ <div class="form-group">
37
+ <%= label_tag :payment_method_stores, Spree.t(:stores) %>
38
+ <%= f.collection_check_boxes :store_ids, available_stores, :id, :name do |b| %>
39
+ <div class="custom-control custom-checkbox mb-1">
40
+ <%= b.check_box(class: 'custom-control-input') %>
41
+ <%= b.label(class: 'custom-control-label') %>
49
42
  </div>
50
43
  <% end %>
44
+ </div>
45
+ <% end %>
51
46
 
52
- <div class="form-group">
53
- <%= label_tag :payment_method_display_on, Spree.t(:display) %>
54
- <%= f.select :display_on, display_on_options, {}, { class: 'custom-select' } %>
55
- </div>
56
- <div class="form-group">
57
- <%= label_tag :payment_method_auto_capture, Spree.t(:auto_capture) %>
58
- <%= select(:payment_method, :auto_capture, [["#{Spree.t(:use_app_default)} (#{Spree::Config[:auto_capture]})", ''], [Spree.t(:say_yes).to_s, true], [Spree.t(:say_no).to_s, false]], {}, {class: 'custom-select'}) %>
59
- </div>
47
+ <div class="form-group">
48
+ <%= label_tag :payment_method_display_on, Spree.t(:display) %>
49
+ <%= f.select :display_on, display_on_options, {}, { class: 'custom-select' } %>
50
+ </div>
51
+ <div class="form-group">
52
+ <%= label_tag :payment_method_auto_capture, Spree.t(:auto_capture) %>
53
+ <%= select(:payment_method, :auto_capture, [["#{Spree.t(:use_app_default)} (#{Spree::Config[:auto_capture]})", ''], [Spree.t(:say_yes).to_s, true], [Spree.t(:say_no).to_s, false]], {}, {class: 'custom-select'}) %>
54
+ </div>
60
55
 
61
- <div class="form-group">
62
- <label><%= Spree.t(:active) %></label>
63
- <div class="custom-control custom-switch">
64
- <%= f.check_box :active, class: 'custom-control-input' %>
65
- <%= f.label :active, '&nbsp;'.html_safe, class: 'custom-control-label' %>
66
- </div>
67
- </div>
56
+ <div class="form-group">
57
+ <label><%= Spree.t(:active) %></label>
58
+ <div class="custom-control custom-switch">
59
+ <%= f.check_box :active, class: 'custom-control-input' %>
60
+ <%= f.label :active, '&nbsp;'.html_safe, class: 'custom-control-label' %>
68
61
  </div>
69
62
  </div>
70
63
  </div>
@@ -2,9 +2,13 @@
2
2
  <%= page_header_back_button spree.admin_payment_methods_path %>
3
3
  <%= @payment_method.name %>
4
4
  <% end %>
5
- <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @payment_method } %>
6
5
 
7
6
  <%= form_for @payment_method, as: :payment_method, url: spree.admin_payment_method_path(@payment_method) do |f| %>
8
- <%= render 'form', f: f %>
9
- <%= render 'spree/admin/shared/edit_resource_links', f: f %>
7
+ <div class="row">
8
+ <div class="col-lg-6 offset-lg-3">
9
+ <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @payment_method } %>
10
+ <%= render 'form', f: f %>
11
+ <%= render 'spree/admin/shared/edit_resource_links', f: f %>
12
+ </div>
13
+ </div>
10
14
  <% end %>
@@ -3,10 +3,13 @@
3
3
  <%= @payment_method.name %>
4
4
  <% end %>
5
5
 
6
- <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @payment_method } %>
7
-
8
6
  <%= form_for @payment_method, as: :payment_method, url: spree.admin_payment_methods_path do |f| %>
9
7
  <%= f.hidden_field :type %>
10
- <%= render 'form', f: f %>
11
- <%= render 'spree/admin/shared/new_resource_links' %>
8
+ <div class="row">
9
+ <div class="col-lg-6 offset-lg-3">
10
+ <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @payment_method } %>
11
+ <%= render 'form', f: f %>
12
+ <%= render 'spree/admin/shared/new_resource_links' %>
13
+ </div>
14
+ </div>
12
15
  <% end %>
@@ -8,7 +8,7 @@
8
8
 
9
9
  <div class="form-group mb-0">
10
10
  <%= f.label :description, Spree.t(:description) %>
11
- <div class="border rounded mb-0">
11
+ <div class="trix-container mb-0">
12
12
  <%= f.text_area :description, { rows: 10, class: "form-control spree-rte", data: { seo_form_target: 'sourceDescriptionInput' } } %>
13
13
  </div>
14
14
  </div>
@@ -2,10 +2,14 @@
2
2
  <%= Spree.t('admin.edit_profile') %>
3
3
  <% end %>
4
4
 
5
+ <%= content_for :page_actions do %>
6
+ <%= turbo_save_button_tag Spree.t('actions.update'), form: 'edit_user' %>
7
+ <% end %>
8
+
5
9
  <%= form_for @user, url: spree.admin_profile_path, method: :put, as: :user do |f| %>
6
10
  <div class="row">
7
- <div class="col-lg-6 mb-4">
8
- <div class="card">
11
+ <div class="col-lg-6 offset-lg-3">
12
+ <div class="card mb-4">
9
13
  <div class="card-header">
10
14
  <h5 class="card-title"><%= Spree.t('admin.personal_details') %></h5>
11
15
  </div>
@@ -30,9 +34,7 @@
30
34
  </div>
31
35
  </div>
32
36
  </div>
33
- </div>
34
37
 
35
- <div class="col-lg-6 mb-4">
36
38
  <div class="card">
37
39
  <div class="card-header">
38
40
  <h5 class="card-title"><%= Spree.t('admin.notifications') %></h5>
@@ -72,8 +74,4 @@
72
74
  </div>
73
75
  </div>
74
76
  </div>
75
-
76
- <div class="form-actions">
77
- <%= turbo_save_button_tag Spree.t('actions.update') %>
78
- </div>
79
77
  <% end %>
@@ -3,9 +3,55 @@
3
3
  <%= Spree.t(:new_promotion) %>
4
4
  <% end %>
5
5
  <%= form_for :promotion, url: collection_url do |f| %>
6
- <%= render 'form', f: f %>
7
- <p class="alert alert-info text-center mt-3">
8
- In the next step you will be able to add actions and rules to your promotion
9
- </p>
10
- <%= render 'spree/admin/shared/new_resource_links' %>
6
+
7
+ <div class="row">
8
+ <div class="col-12 col-lg-6 offset-lg-3">
9
+ <%= render 'spree/admin/shared/error_messages', target: @promotion %>
10
+
11
+ <div class="card mb-4">
12
+ <div class="card-header">
13
+ <h5 class="card-title">
14
+ <%= Spree.t(:details) %>
15
+ </h5>
16
+ </div>
17
+ <div class="card-body">
18
+ <div class="form-group">
19
+ <%= f.label :name %>
20
+ <%= f.text_field :name, class: 'form-control', required: true, autofocus: true %>
21
+ <%= f.error_message_on :name %>
22
+ <span class="form-text text-muted mt-2">
23
+ Customers will see this in their cart and at checkout.
24
+ </span>
25
+ </div>
26
+ </div>
27
+ </div>
28
+
29
+ <div class="card mb-4">
30
+ <div class="card-header">
31
+ <h5 class="card-title">
32
+ <%= Spree.t(:kind) %>
33
+ </h5>
34
+ </div>
35
+ <div class="card-body">
36
+ <%= render 'spree/admin/promotions/form/kind', f: f %>
37
+ </div>
38
+ </div>
39
+
40
+ <div class="card mb-4">
41
+ <div class="card-header">
42
+ <h5 class="card-title">
43
+ <%= Spree.t(:settings) %>
44
+ </h5>
45
+ </div>
46
+ <div class="card-body">
47
+ <%= render 'spree/admin/promotions/form/settings', f: f %>
48
+ </div>
49
+ </div>
50
+
51
+ <p class="alert alert-info text-center">
52
+ In the next step you will be able to add actions and rules to your promotion
53
+ </p>
54
+ <%= render 'spree/admin/shared/new_resource_links' %>
55
+ </div>
56
+ </div>
11
57
  <% end %>
@@ -38,7 +38,7 @@
38
38
  <% if record.respond_to?(:audits) && spree.respond_to?(:admin_audits_path) && defined?(Audited) && can?(:read, Audited.audit_class) %>
39
39
  <a href="<%= spree.admin_audits_path(q: { auditable_id_eq: record.id, auditable_type_eq: record.class.to_s }) %>" target="_blank" class="dropdown-item">
40
40
  <%= icon 'history' %>
41
- <%= Spree.t(:audit_log) %>
41
+ <%= Spree.t('admin.audit_log') %>
42
42
  </a>
43
43
  <% end %>
44
44
  <% if record.respond_to?(:number) %>
@@ -71,8 +71,8 @@
71
71
  <% end %>
72
72
 
73
73
  <% if content_for?(:page_tabs) %>
74
- <div class="container">
75
- <ul class="nav nav-pills flex-nowrap w-100 mb-3">
74
+ <div class="container-fluid" id="page-tabs">
75
+ <ul class="nav">
76
76
  <%= yield :page_tabs %>
77
77
  </ul>
78
78
  </div>
@@ -56,4 +56,5 @@
56
56
  <script>
57
57
  window.Spree = window.Spree || {}
58
58
  Spree.adminPath = '<%= spree.admin_path %>'
59
+ Spree.locale = '<%= I18n.locale %>'
59
60
  </script>
@@ -1,4 +1,2 @@
1
- <ul class="nav mb-0" id="pills-tab" role="tablist">
2
- <%= nav_item(Spree.t(:stock_items), spree.admin_stock_items_path) if can?(:manage, Spree::StockItem) %>
3
- <%= nav_item(Spree.t(:stock_transfers), spree.admin_stock_transfers_path) if can?(:manage, Spree::StockTransfer) %>
4
- </ul>
1
+ <%= nav_item(Spree.t(:stock_items), spree.admin_stock_items_path) if can?(:manage, Spree::StockItem) %>
2
+ <%= nav_item(Spree.t(:stock_transfers), spree.admin_stock_transfers_path) if can?(:manage, Spree::StockTransfer) %>
@@ -2,7 +2,7 @@
2
2
  <% unless session[:spree_enterprise_edition_notice_dismissed] %>
3
3
  <section class="d-none d-lg-block">
4
4
  <div id="enterprise-edition-notice">
5
- <%= link_to '', spree.admin_dismiss_enterprise_edition_notice_path, method: :patch, class: 'btn-close' %>
5
+ <%= link_to '', spree.admin_dismiss_enterprise_edition_notice_path, data: { turbo_method: :patch }, class: 'btn-close' %>
6
6
  <p>You're using Spree Community Edition. To get access to all features, please upgrade to Enterprise Edition.</p>
7
7
 
8
8
  <%= external_link_to 'Upgrade', 'https://spreecommerce.org/pricing', target: '_blank', class: 'btn btn-link btn-sm shadow-xs' %>
@@ -6,15 +6,19 @@
6
6
  <%= Spree.t(:settings) %>
7
7
  <% end %>
8
8
 
9
- <%= content_for(:page_actions) do %>
9
+ <%= content_for(:page_actions_dropdown) do %>
10
10
  <%= link_to_edit_translations(@store) %>
11
11
  <% end %>
12
12
 
13
+ <%= content_for(:page_actions) do %>
14
+ <%= turbo_save_button_tag Spree.t('actions.update'), form: "edit_store_#{@store.id}" %>
15
+ <% end %>
16
+
13
17
  <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @store }, class: 'mb-5 pb-5' %>
14
18
 
15
19
  <%= form_for @store, url: spree.admin_storefront_path, method: :patch do |f| %>
16
20
  <div class="row">
17
- <div class="col-lg-6">
21
+ <div class="col-lg-6 offset-lg-3">
18
22
  <div class="card mb-4">
19
23
  <div class="card-header">
20
24
  <h5 class="card-title">
@@ -85,9 +89,7 @@
85
89
  </div>
86
90
  </div>
87
91
  </div>
88
- </div>
89
92
 
90
- <div class="col-lg-6">
91
93
  <div class="card mb-4">
92
94
  <div class="card-header">
93
95
  <h5 class="card-title">
@@ -139,6 +141,4 @@
139
141
  </div>
140
142
  </div>
141
143
  </div>
142
-
143
- <%= render 'spree/admin/stores/form/buttons' %>
144
144
  <% end %>
@@ -9,5 +9,4 @@
9
9
  <%= render partial: 'spree/admin/stores/form/emails', locals: { f: f } if params[:section] == 'emails' %>
10
10
  <%= render partial: 'spree/admin/stores/form/checkout', locals: { f: f } if params[:section] == 'checkout' %>
11
11
  <%= render partial: 'spree/admin/stores/form/policies', locals: { f: f } if params[:section] == 'policies' %>
12
- <%= render 'spree/admin/stores/form/buttons' %>
13
12
  <% end %>
@@ -2,33 +2,14 @@
2
2
  <%= Spree.t(:checkout) %> <%= Spree.t(:settings) %>
3
3
  <% end %>
4
4
 
5
- <%= content_for :page_alerts do %>
6
- <div class="alert alert-info mb-3">
7
- <p>
8
- <%= Spree.t('admin.checkout_settings.policy_copy', policies_link: link_to(Spree.t(:policies), spree.edit_admin_store_path + '?section=policies', class: 'alert-link')).html_safe %>
9
- </p>
10
- </div>
11
- <% end %>
12
-
13
5
  <div class="row">
14
- <div class="col-lg-7">
15
- <div class="card mb-4">
16
- <div class="card-header">
17
- <h5 class="card-title"><%= Spree.t(:checkout_message) %></h5>
18
- </div>
19
-
20
- <div class="card-body">
21
- <p class="text-muted">
22
- <%= Spree.t('admin.checkout_settings.checkout_message_description') %>
23
- </p>
24
- <div class="trix-container">
25
- <%= f.rich_text_area :checkout_message, class: 'overflow-auto', style: 'height: 300px' %>
26
- </div>
27
- </div>
6
+ <div class="col-lg-6 offset-lg-3">
7
+ <div class="alert alert-info mb-3">
8
+ <p>
9
+ <%= Spree.t('admin.checkout_settings.policy_copy', policies_link: link_to(Spree.t(:policies), spree.edit_admin_store_path + '?section=policies', class: 'alert-link')).html_safe %>
10
+ </p>
28
11
  </div>
29
- </div>
30
12
 
31
- <div class="col-lg-5">
32
13
  <div class="card mb-4">
33
14
  <div class="card-header">
34
15
  <h5 class="card-title"><%= Spree.t(:settings) %></h5>
@@ -66,5 +47,20 @@
66
47
  </div>
67
48
  </div>
68
49
  </div>
50
+
51
+ <div class="card mb-4">
52
+ <div class="card-header">
53
+ <h5 class="card-title"><%= Spree.t(:checkout_message) %></h5>
54
+ </div>
55
+
56
+ <div class="card-body">
57
+ <p class="text-muted">
58
+ <%= Spree.t('admin.checkout_settings.checkout_message_description') %>
59
+ </p>
60
+ <div class="trix-container">
61
+ <%= f.rich_text_area :checkout_message, class: 'overflow-auto', style: 'height: 300px' %>
62
+ </div>
63
+ </div>
64
+ </div>
69
65
  </div>
70
66
  </div>
@@ -3,24 +3,7 @@
3
3
  <% end %>
4
4
 
5
5
  <div class="row">
6
- <div class="col-lg-6">
7
- <div class="card mb-4">
8
- <div class="card-header">
9
- <h5 class="card-title">Logo for emails</h5>
10
- </div>
11
- <div class="card-body">
12
- <p class="text-muted">This logo is included in all email notifications such as order confirmation</p>
13
- <%= render 'active_storage/upload_form', form: f, field_name: :mailer_logo, width: 204, height: 104 %>
14
- <p class="form-text text-muted mb-0 mt-2">
15
- We recommend images with a transparent background.
16
- <br />
17
- Only JPEG and PNG formats are supported.
18
- </p>
19
- </div>
20
- </div>
21
- </div>
22
-
23
- <div class="col-lg-6">
6
+ <div class="col-lg-6 offset-lg-3">
24
7
  <div class="card mb-4">
25
8
  <div class="card-header">
26
9
  <h5 class="card-title">Email addresses</h5>
@@ -55,5 +38,20 @@
55
38
  </div>
56
39
  </div>
57
40
  </div>
41
+
42
+ <div class="card mb-4">
43
+ <div class="card-header">
44
+ <h5 class="card-title">Logo for emails</h5>
45
+ </div>
46
+ <div class="card-body">
47
+ <p class="text-muted">This logo is included in all email notifications such as order confirmation</p>
48
+ <%= render 'active_storage/upload_form', form: f, field_name: :mailer_logo, width: 204, height: 104 %>
49
+ <p class="form-text text-muted mb-0 mt-2">
50
+ We recommend images with a transparent background.
51
+ <br />
52
+ Only JPEG and PNG formats are supported.
53
+ </p>
54
+ </div>
55
+ </div>
58
56
  </div>
59
57
  </div>
@@ -4,7 +4,7 @@
4
4
  <% end %>
5
5
  <% if @locales.any?%>
6
6
  <% if @locales.many? %>
7
- <%= form_with url: spree.edit_admin_translation_path(@resource, resource_type: @resource.class.to_s), class: "w-100 d-flex justify-content-end", data: { controller: 'auto-submit', turbo_frame: 'translations_table'}, method: :get do |f| %>
7
+ <%= form_with url: spree.edit_admin_translation_path(@resource, resource_type: @resource.class.to_s), class: "w-100 d-flex justify-content-end mb-3", data: { controller: 'auto-submit', turbo_frame: 'translations_table'}, method: :get do |f| %>
8
8
  <div class="form-inline gap-2">
9
9
  <%= f.label :translation_locale, Spree.t(:language) %>
10
10
  <%= f.select :translation_locale, options_for_select(@locales.map { |locale| [Spree.t('i18n.this_file_language', locale: locale), locale] }, @selected_translation_locale), {}, { class: 'custom-select', data: { action: 'change->auto-submit#submit' } } %>
@@ -19,9 +19,9 @@
19
19
  <table class="table">
20
20
  <thead>
21
21
  <tr>
22
- <th scope="col" class="w-10 text-center"><%= Spree.t(:field) %></th>
23
- <th scope="col" class="w-40 text-center"><%= Spree.t('i18n.this_file_language', locale: @default_locale) %> (<%= Spree.t(:default) %>)</th>
24
- <th scope="col" class="w-50 text-center"><%= Spree.t('i18n.this_file_language', locale: @selected_translation_locale) %></th>
22
+ <th scope="col" class="w-10"><%= Spree.t(:field) %></th>
23
+ <th scope="col" class="w-40"><%= Spree.t('i18n.this_file_language', locale: @default_locale) %> (<%= Spree.t(:default) %>)</th>
24
+ <th scope="col" class="w-50"><%= Spree.t('i18n.this_file_language', locale: @selected_translation_locale) %></th>
25
25
  </tr>
26
26
  </thead>
27
27
  <tbody>
@@ -11,7 +11,11 @@
11
11
 
12
12
  <%= f.fields_for :option_values do |ff| %>
13
13
  <% ff.object.class.translatable_fields.each do |field| %>
14
- <%= render "spree/admin/translations/translation_rows/text_field_row", f: ff, field: field, locale: locale %>
14
+ <tr>
15
+ <td><%= Spree.t(field) %></td>
16
+ <td><%= ff.object.send(field) %></td>
17
+ <td><%= ff.text_field "#{field}_#{locale}", class: 'form-control' %></td>
18
+ </tr>
15
19
  <% end %>
16
20
  <% end %>
17
21
  <% end %>
@@ -1,11 +1,9 @@
1
1
  <%# locals: (f:, resource:, locale:) %>
2
2
 
3
3
  <% resource.class.translatable_fields.each do |field| %>
4
- <% next if field == :meta_keywords %>
5
-
6
4
  <% case field%>
7
5
  <% when :description %>
8
- <%= render "spree/admin/translations/translation_rows/rich_textarea_row", f: f, field: field, locale: locale %>
6
+ <%= render "spree/admin/translations/translation_rows/tinymce_row", f: f, field: field, locale: locale %>
9
7
  <% when :meta_description %>
10
8
  <%= render "spree/admin/translations/translation_rows/textarea_row", f: f, field: field, locale: locale %>
11
9
  <% else %>
@@ -11,19 +11,11 @@
11
11
  %>
12
12
 
13
13
  <tr>
14
- <td class="text-center"><%= Spree.t(field) %></td>
14
+ <td><%= Spree.t(field) %></td>
15
15
  <td>
16
- <div class="form-group">
17
- <div class="input-group">
18
- <% if base_permalink.present? %>
19
- <div class="input-group-prepend">
20
- <span class="input-group-text"><%= base_permalink %></span>
21
- </div>
22
- <% end %>
23
-
24
- <%= value %>
25
- </div>
26
- </div>
16
+ <code>
17
+ <%= f.object.permalink %>
18
+ </code>
27
19
  </td>
28
20
  <td>
29
21
  <div class="form-group">
@@ -1,13 +1,13 @@
1
1
  <%# locals: (f:, field:, locale:) %>
2
2
 
3
3
  <tr>
4
- <td class="text-center"><%= Spree.t(field) %></td>
4
+ <td><%= Spree.t(field) %></td>
5
5
  <td class="text-wrap">
6
6
  <%= @resource.send(field)%>
7
7
  </td>
8
8
  <td>
9
9
  <div class="trix-container mb-0">
10
- <%= f.rich_textarea "#{field}_#{locale}" %>
10
+ <%= f.rich_text_area "#{field}_#{locale}" %>
11
11
  </div>
12
12
  </td>
13
13
  </tr>
@@ -1,7 +1,7 @@
1
1
  <%# locals: (f:, field:, locale:) %>
2
2
 
3
3
  <tr>
4
- <td class="text-center"><%= Spree.t(field) %></td>
4
+ <td><%= Spree.t(field) %></td>
5
5
  <td><%= @resource.send(field) %></td>
6
6
  <td><%= f.text_field "#{field}_#{locale}", class: 'form-control' %></td>
7
7
  </tr>
@@ -1,11 +1,11 @@
1
1
  <%# locals: (f:, field:, locale:) %>
2
2
 
3
3
  <tr>
4
- <td class="text-center"><%= Spree.t(field) %></td>
4
+ <td><%= Spree.t(field) %></td>
5
5
  <td>
6
6
  <%= @resource.send(field) %>
7
7
  </td>
8
8
  <td>
9
- <%= f.textarea "#{field}_#{locale}", rows: 5, class: "form-control", data: { controller: 'textarea-autogrow'} %>
9
+ <%= f.text_area "#{field}_#{locale}", rows: 5, class: "form-control", data: { controller: 'textarea-autogrow'} %>
10
10
  </td>
11
11
  </tr>
@@ -0,0 +1,13 @@
1
+ <%# locals: (f:, field:, locale:) %>
2
+
3
+ <tr>
4
+ <td><%= Spree.t(field) %></td>
5
+ <td>
6
+ <%= @resource.send(field) %>
7
+ </td>
8
+ <td>
9
+ <div class="trix-container">
10
+ <%= f.text_area "#{field}_#{locale}", rows: 10, class: "form-control spree-rte" %>
11
+ </div>
12
+ </td>
13
+ </tr>
@@ -3,18 +3,15 @@
3
3
  <%= @variant.human_name %>
4
4
  <% end %>
5
5
 
6
- <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @variant } %>
7
-
8
6
  <%= form_for [:admin, @product, @variant] do |f| %>
9
7
  <div class="row">
10
- <div class="col-lg-6">
8
+ <div class="col-lg-6 offset-lg-3">
9
+ <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @variant } %>
11
10
  <%= render 'spree/admin/variants/form/basic', f: f %>
12
11
  <%= render 'spree/admin/variants/form/pricing', f: f %>
13
12
  <%= render 'spree/admin/variants/form/inventory', f: f %>
14
- </div>
15
- <div class="col-lg-6">
16
13
  <%= render 'spree/admin/variants/form/media', viewable: @variant %>
14
+ <%= render 'spree/admin/shared/edit_resource_links', f: f %>
17
15
  </div>
18
16
  </div>
19
- <%= render 'spree/admin/shared/edit_resource_links', f: f %>
20
17
  <% end %>
@@ -4,8 +4,18 @@
4
4
  <%= Spree.t(:inventory) %>
5
5
  </h5>
6
6
  </div>
7
- <div class="card-body p-0">
8
- <table class="table">
7
+ <div class="card-body p-0" data-controller="reveal" data-reveal-hidden-class="d-none">
8
+ <div class="custom-control custom-checkbox mb-4 m-3">
9
+ <%= f.check_box :track_inventory,
10
+ class: 'custom-control-input',
11
+ data: {
12
+ action: 'change->reveal#toggle'
13
+ }
14
+ %>
15
+ <%= f.label :track_inventory, Spree.t(:track_quantity), class: 'custom-control-label' %>
16
+ </div>
17
+
18
+ <table class="table <%= 'd-none' unless f.object.track_inventory? %>" data-reveal-target="item">
9
19
  <thead>
10
20
  <tr>
11
21
  <th><%= Spree.t(:stock_location) %></th>
data/config/routes.rb CHANGED
@@ -249,7 +249,8 @@ Spree::Core::Engine.add_routes do
249
249
  resource :dashboard, controller: 'dashboard'
250
250
  get '/dashboard/analytics', to: 'dashboard#analytics', as: :dashboard_analytics
251
251
  get '/getting-started', to: 'dashboard#getting_started', as: :getting_started
252
- get '/dismiss_enterprise_edition_notice', to: 'dashboard#dismiss_enterprise_edition_notice', as: :dismiss_enterprise_edition_notice
252
+ patch '/dismiss_enterprise_edition_notice', to: 'dashboard#dismiss_enterprise_edition_notice', as: :dismiss_enterprise_edition_notice
253
+ patch '/dismiss_updater_notice', to: 'dashboard#dismiss_updater_notice', as: :dismiss_updater_notice
253
254
 
254
255
  root to: 'dashboard#show'
255
256
  end
@@ -35,10 +35,6 @@ module Spree
35
35
  rescue Selenium::WebDriver::Error::TimeoutError
36
36
  default_options[:error].nil? ? false : raise(default_options[:error])
37
37
  end
38
-
39
- def fill_in_trix_editor(id, with:)
40
- page.find(id, visible: :all).click.set(with)
41
- end
42
38
  end
43
39
  end
44
40
  end
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.1.0
4
+ version: 5.1.2
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: 2025-07-03 00:00:00.000000000 Z
11
+ date: 2025-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree_core
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.1.0
19
+ version: 5.1.2
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.1.0
26
+ version: 5.1.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: spree_api
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 5.1.0
33
+ version: 5.1.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 5.1.0
40
+ version: 5.1.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: active_link_to
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -837,7 +837,6 @@ files:
837
837
  - app/views/spree/admin/promotion_rules/new.html.erb
838
838
  - app/views/spree/admin/promotions/_actions.html.erb
839
839
  - app/views/spree/admin/promotions/_filters.html.erb
840
- - app/views/spree/admin/promotions/_form.html.erb
841
840
  - app/views/spree/admin/promotions/_header.html.erb
842
841
  - app/views/spree/admin/promotions/_promotion.html.erb
843
842
  - app/views/spree/admin/promotions/_rules.html.erb
@@ -1050,6 +1049,7 @@ files:
1050
1049
  - app/views/spree/admin/translations/translation_rows/_rich_textarea_row.html.erb
1051
1050
  - app/views/spree/admin/translations/translation_rows/_text_field_row.html.erb
1052
1051
  - app/views/spree/admin/translations/translation_rows/_textarea_row.html.erb
1052
+ - app/views/spree/admin/translations/translation_rows/_tinymce_row.html.erb
1053
1053
  - app/views/spree/admin/user_passwords/edit.html.erb
1054
1054
  - app/views/spree/admin/user_passwords/new.html.erb
1055
1055
  - app/views/spree/admin/user_sessions/new.html.erb
@@ -1144,9 +1144,9 @@ licenses:
1144
1144
  - AGPL-3.0-or-later
1145
1145
  metadata:
1146
1146
  bug_tracker_uri: https://github.com/spree/spree/issues
1147
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.1.0
1147
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.1.2
1148
1148
  documentation_uri: https://docs.spreecommerce.org/
1149
- source_code_uri: https://github.com/spree/spree/tree/v5.1.0
1149
+ source_code_uri: https://github.com/spree/spree/tree/v5.1.2
1150
1150
  post_install_message:
1151
1151
  rdoc_options: []
1152
1152
  require_paths:
@@ -1,47 +0,0 @@
1
- <%= render 'spree/admin/shared/error_messages', target: @promotion %>
2
-
3
- <div class="row">
4
- <div class="col-12 col-lg-8">
5
- <div class="card mb-4">
6
- <div class="card-header">
7
- <h5 class="card-title">
8
- <%= Spree.t(:details) %>
9
- </h5>
10
- </div>
11
- <div class="card-body">
12
- <div class="form-group">
13
- <%= f.label :name %>
14
- <%= f.text_field :name, class: 'form-control', required: true, autofocus: true %>
15
- <%= f.error_message_on :name %>
16
- <span class="form-text text-muted mt-2">
17
- Customers will see this in their cart and at checkout.
18
- </span>
19
- </div>
20
- </div>
21
- </div>
22
-
23
- <div class="card">
24
- <div class="card-header">
25
- <h5 class="card-title">
26
- <%= Spree.t(:kind) %>
27
- </h5>
28
- </div>
29
- <div class="card-body">
30
- <%= render 'spree/admin/promotions/form/kind', f: f %>
31
- </div>
32
- </div>
33
- </div>
34
-
35
- <div class="col-12 col-lg-4">
36
- <div class="card">
37
- <div class="card-header">
38
- <h5 class="card-title">
39
- <%= Spree.t(:settings) %>
40
- </h5>
41
- </div>
42
- <div class="card-body">
43
- <%= render 'spree/admin/promotions/form/settings', f: f %>
44
- </div>
45
- </div>
46
- </div>
47
- </div>