spree_admin 5.3.0.rc2 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1ff251dbe15b6b8dbfdf0ef4dcf0d35c372966ce9ee8be619084d70383c9d94
4
- data.tar.gz: 257c9f1fe361fb31e1b3de98fd2dcdbd1a1bb798284908ef368c02cd6769be83
3
+ metadata.gz: 550e43e0d20266ca7432c695dc429234fe9152cb9a5716ca6d8518482744d493
4
+ data.tar.gz: b1d9bab21c05510f2c8a2a3a82c1c97e90b92853a91f46abbae29980428d32d9
5
5
  SHA512:
6
- metadata.gz: 0a70b9400b1bb81e40cc5f0282303d2428708f1f7bcd4729ef6f1e00c9a3ec5da689bed2ce8c15ff07619e39a8981e6cb294d350b31da4d361f3b0ced0d740d0
7
- data.tar.gz: 7353c8a431c666c35b823e8888f6561c7b92146165b7e3ad32164f636a8f934f46bdfa9f474236379ae25bdb07af06ac67016a885dc3b1749a6b76fb2e3cb821
6
+ metadata.gz: 2e5951bcf9cdd501d16e6410ef893125e619f84a865cb16fb0176894505075eca514c76348cd387b9927eb4f1fdc37abed2349c49ecf116acf1fa99399ce2b6e
7
+ data.tar.gz: 1098481f56d76418a17dfff7806e4b64527ef2be597e11800992ad4393617aa66c6a5f54cae85d329315d3cd2f92af414ffe86c165ae2a4f6fc9c8c03f8bec6f
data/README.md CHANGED
@@ -1,21 +1,150 @@
1
- # Spree Admin Dashboard
1
+ # Spree Admin
2
2
 
3
- Welcome to the Spree Admin Dashboard repository. This is a new, shiny admin dashboard for Spree Commerce 5.
3
+ [![Gem Version](https://badge.fury.io/rb/spree_admin.svg)](https://badge.fury.io/rb/spree_admin)
4
4
 
5
- ## Installation
5
+ Spree Admin provides a modern, fully-featured admin dashboard for managing your Spree Commerce store.
6
+
7
+ ## Overview
8
+
9
+ This gem includes:
6
10
 
7
- To install the Spree Admin Dashboard, run the following command:
11
+ - **Dashboard** - Analytics and KPI overview
12
+ - **Product Management** - Products, variants, properties, option types
13
+ - **Order Management** - Orders, payments, shipments, refunds
14
+ - **Customer Management** - Customer accounts and order history
15
+ - **Inventory Management** - Stock locations, stock items, transfers
16
+ - **Promotions** - Discounts, coupon codes, promotion rules
17
+ - **Content Management** - Pages, menus, navigation
18
+ - **Settings** - Store configuration, payment methods, shipping methods, taxes
19
+
20
+ ## Installation
8
21
 
9
22
  ```bash
10
23
  bundle add spree_admin
24
+ bin/rails g spree:admin:install
25
+ ```
26
+
27
+ You will need to restart your web server and run `bin/dev` to start the development server for the admin dashboard.
28
+
29
+ ## Features
30
+
31
+ ### Dynamic Tables
32
+
33
+ Register customizable tables for your resources:
34
+
35
+ ```ruby
36
+ # config/initializers/spree_admin_tables.rb
37
+ Rails.application.config.after_initialize do
38
+ Spree.admin.tables.register(:gift_cards, model_class: Spree::GiftCard)
39
+
40
+ Spree.admin.tables.gift_cards.add :code,
41
+ label: :code,
42
+ type: :string,
43
+ sortable: true,
44
+ filterable: true,
45
+ default: true,
46
+ position: 10
47
+ end
48
+ ```
49
+
50
+ Column types: `:string`, `:currency`, `:date`, `:datetime`, `:boolean`, `:custom`
51
+
52
+ ### Navigation
53
+
54
+ Configure sidebar and settings navigation:
55
+
56
+ ```ruby
57
+ # config/initializers/spree_admin_navigation.rb
58
+ Rails.application.config.after_initialize do
59
+ Spree.admin.navigation.sidebar.add :reports,
60
+ label: :reports,
61
+ url: :admin_reports_path,
62
+ icon: 'chart-bar',
63
+ position: 60,
64
+ if: -> { can?(:manage, Spree::Report) }
65
+ end
11
66
  ```
12
67
 
13
- Run the install generator:
68
+ ### Partial Hooks
69
+
70
+ Extend the admin interface with partial hooks (100+ available):
71
+
72
+ ```erb
73
+ <%# app/views/spree/admin/orders/_show_sidebar.html.erb %>
74
+ <div class="card">
75
+ <div class="card-body">
76
+ Custom order sidebar content
77
+ </div>
78
+ </div>
79
+ ```
80
+
81
+ ### Controllers
82
+
83
+ Admin controllers inherit from `Spree::Admin::ResourceController` for consistent CRUD:
84
+
85
+ ```ruby
86
+ module Spree
87
+ module Admin
88
+ class GiftCardsController < ResourceController
89
+ private
90
+
91
+ def model_class
92
+ Spree::GiftCard
93
+ end
94
+
95
+ def permitted_resource_params
96
+ params.require(:gift_card).permit(
97
+ Spree::PermittedAttributes.gift_card_attributes
98
+ )
99
+ end
100
+ end
101
+ end
102
+ end
103
+ ```
104
+
105
+ ### Form Builder
106
+
107
+ Use the Spree admin form builder for consistent styling:
108
+
109
+ ```erb
110
+ <%= f.spree_text_field :name %>
111
+ <%= f.spree_text_area :description %>
112
+ <%= f.spree_check_box :active %>
113
+ <%= f.spree_select :status, options_for_status %>
114
+ ```
115
+
116
+ ## Technology Stack
117
+
118
+ - **Tailwind CSS** - Utility-first CSS framework
119
+ - **Turbo/Hotwire** - SPA-like interactions without JavaScript frameworks
120
+ - **Stimulus** - Modest JavaScript framework for controllers
121
+
122
+ ## Testing
14
123
 
15
124
  ```bash
16
- bin/rails g spree:admin:install
125
+ cd admin
126
+ bundle exec rake test_app # First time only
127
+ bundle exec rspec
128
+ ```
129
+
130
+ For controller specs, use `stub_authorization!` for authentication:
131
+
132
+ ```ruby
133
+ RSpec.describe Spree::Admin::ProductsController, type: :controller do
134
+ stub_authorization!
135
+ render_views
136
+
137
+ describe 'GET #index' do
138
+ it 'renders the index template' do
139
+ get :index
140
+ expect(response).to render_template(:index)
141
+ end
142
+ end
143
+ end
17
144
  ```
18
145
 
19
- This will create the necessary files for the admin dashboard.
146
+ ## Documentation
20
147
 
21
- You will need to restart your web server and run `bin/dev` to start the development server for the admin dashboard.
148
+ - [Admin Customization Guide](https://docs.spreecommerce.org/developer/customization/admin)
149
+ - [Navigation Configuration](https://docs.spreecommerce.org/developer/customization/admin-navigation)
150
+ - [Permissions Guide](https://docs.spreecommerce.org/developer/customization/permissions)
@@ -5,7 +5,7 @@
5
5
  @layer components {
6
6
  .card,
7
7
  .card-lg {
8
- @apply relative flex flex-col min-w-0 break-words bg-white border border-gray-200 rounded-2xl;
8
+ @apply relative flex flex-col min-w-0 break-words bg-white border border-gray-200 rounded-xl;
9
9
  background-clip: border-box;
10
10
  }
11
11
 
@@ -14,7 +14,7 @@
14
14
  }
15
15
 
16
16
  .card .card {
17
- @apply rounded-2xl;
17
+ @apply rounded-xl;
18
18
  }
19
19
 
20
20
  /* Card with table */
@@ -87,7 +87,7 @@
87
87
  }
88
88
 
89
89
  .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-2xl)-1px)];
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)];
91
91
  }
92
92
 
93
93
  .card-header .card-title {
@@ -111,7 +111,7 @@
111
111
  }
112
112
 
113
113
  .card-footer:last-child {
114
- @apply rounded-b-[calc(var(--radius-2xl)-1px)];
114
+ @apply rounded-b-[calc(var(--radius-xl)-1px)];
115
115
  }
116
116
 
117
117
  .card-footer.border-top,
@@ -135,13 +135,13 @@
135
135
  }
136
136
 
137
137
  .card-img-top {
138
- @apply w-full rounded-t-[calc(var(--radius-2xl)-1px)];
138
+ @apply w-full rounded-t-[calc(var(--radius-xl)-1px)];
139
139
  }
140
140
 
141
141
  /* Collapsable Card */
142
142
  .collapsable-card {
143
143
  @apply relative flex flex-col min-w-0 break-words overflow-hidden;
144
- @apply bg-white border border-gray-200 rounded-2xl;
144
+ @apply bg-white border border-gray-200 rounded-xl;
145
145
  background-clip: border-box;
146
146
  }
147
147
 
@@ -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 pl-3 pr-8 text-base font-normal leading-normal;
26
+ @apply block w-full py-2 px-3 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;
@@ -25,16 +25,7 @@ module Spree
25
25
  end
26
26
 
27
27
  def handle_bulk_operation_response
28
- respond_to do |format|
29
- format.turbo_stream do
30
- flash.now[:success] = flash_message_for(bulk_collection, :successfully_updated)
31
- render partial: 'spree/admin/shared/close_bulk_modal'
32
- end
33
- format.html do
34
- flash[:success] = flash_message_for(bulk_collection, :successfully_updated)
35
- redirect_to request.referer
36
- end
37
- end
28
+ redirect_back fallback_location: request.referer, status: :see_other
38
29
  end
39
30
 
40
31
  def bulk_collection
@@ -86,22 +86,10 @@ module Spree
86
86
  end
87
87
 
88
88
  def bulk_status_update
89
- if bulk_collection.update_all(status: params[:status], updated_at: Time.current)
90
- product_ids = bulk_collection.ids
91
-
92
- if defined?(Spree::Webhooks::Subscriber) && Spree::Webhooks::Subscriber.any?
93
- ::Spree::Products::QueueStatusChangedWebhook.call(
94
- ids: product_ids,
95
- event: Spree::Product::STATUS_TO_WEBHOOK_EVENT[params[:status]]
96
- )
97
- end
98
-
99
- invoke_callbacks(:bulk_status_update, :after)
89
+ bulk_collection.update_all(status: params[:status], updated_at: Time.current)
90
+ invoke_callbacks(:bulk_status_update, :after)
100
91
 
101
- flash.now[:success] = Spree.t('admin.bulk_ops.products.status_updated', status: params[:status].titleize)
102
- else
103
- flash.now[:error] = Spree.t('something_went_wrong')
104
- end
92
+ handle_bulk_operation_response
105
93
  end
106
94
 
107
95
  def bulk_remove_from_taxons
@@ -10,23 +10,24 @@
10
10
  </div>
11
11
  <div class="dialog-body">
12
12
  <%= render 'spree/admin/shared/error_messages', target: @export %>
13
- <div class="custom-control custom-radio">
13
+ <div class="custom-control custom-radio hover:bg-gray-50 rounded-lg p-3">
14
14
  <%= f.radio_button :record_selection, 'filtered', class: 'custom-control-input' %>
15
- <%= f.label :record_selection, for: :export_record_selection_filtered, class: 'custom-control-label' do %>
15
+ <%= f.label :record_selection, for: :export_record_selection_filtered, class: 'custom-control-label flex-col items-start' do %>
16
16
  <%= Spree.t(:filtered_records) %>
17
+ <span class="text-gray-600 font-normal">
18
+ <%= Spree.t('admin.export_only_filtered_records') %>
19
+ </span>
17
20
  <% end %>
18
- <span class="text-gray-600 font-normal ml-7 mt-2">
19
- <%= Spree.t('admin.export_only_filtered_records') %>
20
- </span>
21
21
  </div>
22
- <div class="custom-control custom-radio mt-4">
22
+ <div class="custom-control custom-radio hover:bg-gray-50 rounded-lg p-3">
23
23
  <%= f.radio_button :record_selection, 'all', class: 'custom-control-input' %>
24
- <%= f.label :record_selection, for: :export_record_selection_all, class: 'custom-control-label' do %>
24
+ <%= f.label :record_selection, for: :export_record_selection_all, class: 'custom-control-label flex-col items-start' do %>
25
25
  <%= Spree.t(:all) %>
26
- <% end %>
27
- <span class="text-gray-600 font-normal ml-7 mt-2">
28
- <%= Spree.t('admin.export_all') %>
26
+ <span class="text-gray-600 font-normal">
27
+ <%= Spree.t('admin.export_all') %>
28
+ </span>
29
29
  </span>
30
+ <% end %>
30
31
  </div>
31
32
  </div>
32
33
  <div class="dialog-footer">
@@ -34,7 +34,7 @@
34
34
  </div>
35
35
  <% if can?(:manage, @product.default_variant) %>
36
36
  <div class="variants-table__body__cell column-actions flex items-center">
37
- <a href="#" class="btn btn-light invisible ml-2" data-slot="variantEditButton">
37
+ <a href="#" class="btn btn-sm btn-light invisible ml-2" data-slot="variantEditButton">
38
38
  <%= icon('edit') %>
39
39
  <%= Spree.t(:edit)%>
40
40
  </a>
@@ -10,9 +10,9 @@
10
10
  <% if @promotion_action.type.nil? %>
11
11
  <% options_for_promotion_action_types(@promotion).each do |action_type| %>
12
12
  <% key = action_type.to_s.demodulize.underscore %>
13
- <%= link_to spree.new_admin_promotion_action_path(@promotion, promotion_action: { type: action_type }), class: 'flex align-items-top w-full py-2 px-4 hover:bg-gray-100 rounded-xl mb-2', data: { turbo_prefetch: false } do %>
14
- <%= radio_button_tag :type, action_type, checked: @promotion_action.type == action_type %>
15
- <div class="ml-4">
13
+ <%= link_to spree.new_admin_promotion_action_path(@promotion, promotion_action: { type: action_type }), class: 'flex align-items-top w-full py-2 px-4 hover:bg-gray-100 rounded-xl mb-2 no-underline', data: { turbo_prefetch: false } do %>
14
+ <%= radio_button_tag :type, action_type, class: 'hidden',checked: @promotion_action.type == action_type %>
15
+ <div>
16
16
  <h6><%= Spree.t("promotion_action_types.#{key}.name") %></h6>
17
17
  <p class="text-gray-600 mb-0"><%= Spree.t("promotion_action_types.#{key}.description") %></p>
18
18
  </div>
@@ -12,7 +12,7 @@
12
12
  <% key = rule_type.demodulize.underscore %>
13
13
  <%= link_to spree.new_admin_promotion_rule_path(@promotion, promotion_rule: { type: rule_type }), class: 'flex align-items-top w-full py-2 px-4 hover:bg-gray-100 rounded-xl mb-2 no-underline', data: { turbo_prefetch: false } do %>
14
14
  <%= radio_button_tag :type, rule_type, class: 'hidden' %>
15
- <div class="">
15
+ <div>
16
16
  <h6 class="font-bold mb-1"><%= Spree.t("promotion_rule_types.#{key}.name") %></h6>
17
17
  <p class="text-gray-600 mb-0"><%= Spree.t("promotion_rule_types.#{key}.description") %></p>
18
18
  </div>
@@ -5,40 +5,40 @@
5
5
 
6
6
  <div data-reveal-target="item" class="rounded-md p-6 bg-gray-25 mt-6 <% if @promotion.automatic? %>hidden<% end %>">
7
7
  <div data-controller="reveal" data-reveal-hidden-class="hidden">
8
- <div class="flex items-start custom-control custom-radio">
8
+ <div class="custom-control custom-radio">
9
9
  <%= f.radio_button :multi_codes, false, data: { action: 'change->reveal#toggle' }, class: 'custom-control-input' %>
10
- <%= f.label :multi_codes_false, class: 'custom-control-label' do %>
10
+ <%= f.label :multi_codes_false, class: 'custom-control-label flex-col items-start' do %>
11
11
  One code for all customers
12
- <span class="form-text font-normal mr-1 mt-2">
12
+ <span class="form-text font-normal">
13
13
  You can limit the number of times this code can be used.
14
14
  </span>
15
15
  <% end %>
16
16
  </div>
17
- <div data-reveal-target="item" class="mb-6 mt-2 ml-6 <% if @promotion.multi_codes? %>hidden<% end %>">
17
+ <div data-reveal-target="item" class="mt-2 ml-6 <% if @promotion.multi_codes? %>hidden<% end %>">
18
18
  <%= f.text_field :code, class: 'form-input uppercase', placeholder: 'Your coupon code' %>
19
19
  </div>
20
20
 
21
- <div class="mt-2 flex items-start custom-control custom-radio">
21
+ <div class="mt-6 custom-control custom-radio">
22
22
  <%= f.radio_button :multi_codes, true, data: { action: 'change->reveal#toggle' }, class: 'custom-control-input' %>
23
- <%= f.label :multi_codes_true, class: 'custom-control-label' do %>
23
+ <%= f.label :multi_codes_true, class: 'custom-control-label flex-col items-start' do %>
24
24
  Generate unique codes
25
- <span class="form-text font-normal mr-1 mt-2">
25
+ <span class="form-text font-normal">
26
26
  These codes are generated automatically and can be downloaded as a CSV file. Codes are unique and can only be used once.
27
27
  </span>
28
28
  <% end %>
29
29
  </div>
30
- <div data-reveal-target="item" class="ml-6 mt-2 grid grid-cols-12 gap-6 <% unless @promotion.multi_codes? %>hidden<% end %>">
31
- <div class="col-span-6">
30
+ <div data-reveal-target="item" class="ml-6 mt-2 grid gap-3 <% unless @promotion.multi_codes? %>hidden<% end %>">
31
+ <div>
32
32
  <%= f.text_field :code_prefix, class: 'form-input uppercase', placeholder: 'Coupon Prefix (optional)' %>
33
- <span class="form-text mt-2">
33
+ <span class="form-text mt-1">
34
34
  eg. <strong>ABC</strong>
35
35
  </span>
36
36
  </div>
37
- <div class="col-span-6">
37
+ <div>
38
38
  <% minimum_number_of_codes = @promotion.persisted? && @promotion.coupon_codes.count.positive? ? @promotion.coupon_codes.count : 1 %>
39
39
  <% maximum_number_of_codes = ENV.fetch('PROMOTION_MAX_NUMBER_OF_CODES', 5000) %>
40
40
  <%= f.number_field :number_of_codes, class: 'form-input', placeholder: 'Number of codes', min: minimum_number_of_codes, max: maximum_number_of_codes, step: 1 %>
41
- <span class="form-text mt-2">
41
+ <span class="form-text mt-1">
42
42
  How many codes you want to generate.
43
43
  <% if @promotion.persisted? %>
44
44
  To add more codes just increase this number
@@ -52,10 +52,12 @@
52
52
 
53
53
  <div class="mt-6 custom-control custom-radio">
54
54
  <%= f.radio_button :kind, :automatic, data: { action: 'change->reveal#hide' }, class: 'custom-control-input' %>
55
- <%= f.label :kind_automatic, Spree.t(:automatic_promotion), class: 'custom-control-label' %>
55
+ <%= f.label :kind_automatic, Spree.t(:automatic_promotion), class: 'custom-control-label flex-col items-start' do %>
56
+ <%= Spree.t(:automatic_promotion) %>
57
+ <span class="form-text font-normal">
58
+ This promotion will be automatically applied to all eligible orders.
59
+ </span>
60
+ <% end %>
56
61
 
57
- <p class="form-text mt-2 mb-0">
58
- This promotion will be automatically applied to all eligible orders.
59
- </p>
60
62
  </div>
61
63
  </div>
@@ -1,5 +1,5 @@
1
1
  <%= form_for @store, url: spree.admin_stores_path, data: { turbo: false, controller: 'store-form enable-button' } do |f| %>
2
- <div class="container pt-48">
2
+ <div class="container mx-auto px-4 pt-8">
3
3
  <h1 class="mb-6"><%= Spree.t(:new_store) %></h1>
4
4
 
5
5
  <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @store } %>
@@ -54,12 +54,12 @@
54
54
  <% end %>
55
55
  </div>
56
56
  <div class="col-span-12 lg:col-span-5 lg:col-start-8">
57
- <h5>What will be shared with this new store:</h5>
57
+ <h5 class="mb-2">What will be shared with this new store:</h5>
58
58
  <ul class="list-none p-0">
59
59
  <li>
60
60
  <%= icon('check', class: 'text-green-700') %>
61
61
  <%= Spree.t(:products) %>, <%= Spree.t(:stock_locations) %> & <%= Spree.t(:inventory) %><br />
62
- <em class="ml-24 text-gray-600 text-sm">you can select which ones will be available for this store</em>
62
+ <em class="ml-5 text-gray-600 text-sm">you can select which ones will be available for this store</em>
63
63
  </li>
64
64
  <li>
65
65
  <%= icon('check', class: 'text-green-700') %>
@@ -72,7 +72,7 @@
72
72
  <li>
73
73
  <%= icon('check', class: 'text-green-700') %>
74
74
  <%= Spree.t(:payment_methods) %><br />
75
- <em class="ml-24 text-gray-600 text-sm">you can select which ones will be available for this store</em>
75
+ <em class="ml-5 text-gray-600 text-sm">you can select which ones will be available for this store</em>
76
76
  </li>
77
77
  <li>
78
78
  <%= icon('check', class: 'text-green-700') %>
@@ -80,7 +80,7 @@
80
80
  </li>
81
81
  </ul>
82
82
 
83
- <h5>What will not be shared with this new store:</h5>
83
+ <h5 class="mt-6 mb-2">What will not be shared with this new store:</h5>
84
84
  <ul class="list-none p-0">
85
85
  <li>
86
86
  <%= icon('x', class: 'text-danger') %>
@@ -23,7 +23,7 @@
23
23
  data-query-builder-operators-value="<%= operators_json %>"
24
24
  class="grow flex flex-col justify-between">
25
25
 
26
- <%= form_with url: url_for, method: :get, html: { class: 'grow flex flex-col justify-between' },data: { turbo_frame: '_top', query_builder_target: 'form', action: 'submit->query-builder#submitForm' } do |f| %>
26
+ <%= form_with url: url_for, method: :get, html: { class: 'grow flex flex-col justify-between' }, data: { turbo_frame: frame_name, turbo_action: 'advance', query_builder_target: 'form', action: 'submit->query-builder#submitForm' } do |f| %>
27
27
  <div class="drawer-body">
28
28
  <div class="mb-4 flex items-center gap-2 flex-wrap">
29
29
  <span class="text-sm text-gray-600">
@@ -9,7 +9,7 @@
9
9
  <%= f.spree_check_box :track_inventory, data: { action: 'change->reveal#toggle' } %>
10
10
  </div>
11
11
 
12
- <table class="table <%= 'hidden!' unless f.object.track_inventory? %>" data-reveal-target="item">
12
+ <table class="table border-t <%= 'hidden!' unless f.object.track_inventory? %>" data-reveal-target="item">
13
13
  <thead>
14
14
  <tr>
15
15
  <th scope="col"><%= Spree.t(:stock_location) %></th>
@@ -1,5 +1,5 @@
1
1
  <div class="card mb-6" data-product-form-target="pricesForm">
2
- <div class="card-header flex items-center justify-between">
2
+ <div class="card-header flex items-center justify-between border-b-0">
3
3
  <h5 class="card-title">
4
4
  <%= Spree.t(:pricing) %>
5
5
  </h5>
@@ -9,7 +9,7 @@
9
9
  <% end %>
10
10
  </div>
11
11
  <div class="card-body p-0">
12
- <table class="table">
12
+ <table class="table border-t">
13
13
  <thead>
14
14
  <tr>
15
15
  <th scope="col"><%= Spree.t(:currency) %></th>
@@ -27,7 +27,6 @@ en:
27
27
  set_active: Setting products to active will make those products available on the storefront.
28
28
  set_archived: Setting products to archived will hide them from storefront.
29
29
  set_draft: Setting products to draft will hide them from storefront.
30
- status_updated: Status updated
31
30
  title:
32
31
  add_tags: Add tags
33
32
  add_to_brand: Add to brand
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.0.rc2
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vendo Connect Inc.
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 5.3.0.rc2
18
+ version: 5.3.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: 5.3.0.rc2
25
+ version: 5.3.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: active_link_to
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -802,7 +802,6 @@ files:
802
802
  - app/views/spree/admin/products/_search_result.html.erb
803
803
  - app/views/spree/admin/products/_search_results.html.erb
804
804
  - app/views/spree/admin/products/_table_filter_dropdown.html.erb
805
- - app/views/spree/admin/products/bulk_status_update.turbo_stream.erb
806
805
  - app/views/spree/admin/products/edit.html.erb
807
806
  - app/views/spree/admin/products/form/_base.html.erb
808
807
  - app/views/spree/admin/products/form/_categorization.html.erb
@@ -1256,9 +1255,9 @@ licenses:
1256
1255
  - AGPL-3.0-or-later
1257
1256
  metadata:
1258
1257
  bug_tracker_uri: https://github.com/spree/spree/issues
1259
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.3.0.rc2
1258
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.3.0
1260
1259
  documentation_uri: https://docs.spreecommerce.org/
1261
- source_code_uri: https://github.com/spree/spree/tree/v5.3.0.rc2
1260
+ source_code_uri: https://github.com/spree/spree/tree/v5.3.0
1262
1261
  rdoc_options: []
1263
1262
  require_paths:
1264
1263
  - lib
@@ -1,7 +0,0 @@
1
- <%= render 'spree/admin/shared/close_bulk_modal' %>
2
-
3
- <% @bulk_collection.each do |product| %>
4
- <%= turbo_stream.replace dom_id(product, :status) do %>
5
- <%= render 'spree/admin/products/product_status', product: product %>
6
- <% end %>
7
- <% end %>