solidus_backend 4.1.0 → 4.2.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 +4 -4
- data/app/assets/config/solidus_backend_manifest.js +2 -1
- data/app/assets/images/spree/backend/themes/solidus_admin/remixicon.symbol.svg +11 -0
- data/app/assets/javascripts/spree/backend/components/admin_nav.js +18 -0
- data/app/assets/javascripts/spree/backend/option_value_picker.js +0 -1
- data/app/assets/javascripts/spree/backend/views/promotions/option_values_rule.js +3 -3
- data/app/assets/stylesheets/spree/backend/components/_navigation.scss +11 -0
- data/app/assets/stylesheets/spree/backend/components/_navigation_solidus_admin.scss +274 -0
- data/app/assets/stylesheets/spree/backend/components/_switch_solidus_admin.scss +48 -0
- data/app/assets/stylesheets/spree/backend/shared/_layout.scss +1 -1
- data/app/assets/stylesheets/spree/backend/themes/solidus_admin/_colors.scss +44 -0
- data/app/assets/stylesheets/spree/backend/themes/solidus_admin/_tables.scss +8 -8
- data/app/assets/stylesheets/spree/backend/themes/solidus_admin/_variables.scss +28 -72
- data/app/controllers/spree/admin/resource_controller.rb +13 -9
- data/app/controllers/spree/admin/stock_items_controller.rb +22 -13
- data/app/helpers/spree/admin/navigation_helper.rb +46 -29
- data/app/views/spree/admin/shared/_navigation_solidus_admin.html.erb +101 -0
- data/app/views/spree/admin/shared/_product_sub_menu.html.erb +7 -5
- data/app/views/spree/admin/shared/_promotion_sub_menu.html.erb +4 -2
- data/app/views/spree/admin/shared/_settings_sub_menu.html.erb +8 -6
- data/app/views/spree/admin/shared/_tabs.html.erb +18 -6
- data/app/views/spree/admin/shared/_variant_search.html.erb +8 -1
- data/app/views/spree/admin/stock_items/_stock_management.html.erb +21 -9
- data/app/views/spree/admin/stock_items/index.html.erb +4 -1
- data/app/views/spree/layouts/admin.html.erb +6 -2
- data/lib/spree/backend_configuration/deprecated_tab_constants.rb +34 -0
- data/lib/spree/backend_configuration/menu_item.rb +67 -13
- data/lib/spree/backend_configuration.rb +131 -58
- data/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_es-CL.js +10 -0
- data/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hy.js +37 -0
- metadata +15 -7
@@ -193,7 +193,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
|
|
193
193
|
.find_by!(self.class.parent_data[:find_by] => params["#{parent_model_name}_id"])
|
194
194
|
instance_variable_set("@#{parent_model_name}", @parent)
|
195
195
|
rescue ActiveRecord::RecordNotFound => e
|
196
|
-
resource_not_found(flash_class: e.model.constantize, redirect_url:
|
196
|
+
resource_not_found(flash_class: e.model.constantize, redirect_url: routes_proxy.polymorphic_url([:admin, parent_model_name.pluralize.to_sym]))
|
197
197
|
end
|
198
198
|
|
199
199
|
def parent?
|
@@ -238,17 +238,17 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
|
|
238
238
|
|
239
239
|
def new_object_url(options = {})
|
240
240
|
if parent?
|
241
|
-
|
241
|
+
routes_proxy.new_polymorphic_url([:admin, parent, model_class], options)
|
242
242
|
else
|
243
|
-
|
243
|
+
routes_proxy.new_polymorphic_url([:admin, model_class], options)
|
244
244
|
end
|
245
245
|
end
|
246
246
|
|
247
247
|
def edit_object_url(object, options = {})
|
248
248
|
if parent?
|
249
|
-
|
249
|
+
routes_proxy.polymorphic_url([:edit, :admin, parent, object], options)
|
250
250
|
else
|
251
|
-
|
251
|
+
routes_proxy.polymorphic_url([:edit, :admin, object], options)
|
252
252
|
end
|
253
253
|
end
|
254
254
|
|
@@ -256,20 +256,24 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
|
|
256
256
|
target = object ? object : @object
|
257
257
|
|
258
258
|
if parent?
|
259
|
-
|
259
|
+
routes_proxy.polymorphic_url([:admin, parent, target], options)
|
260
260
|
else
|
261
|
-
|
261
|
+
routes_proxy.polymorphic_url([:admin, target], options)
|
262
262
|
end
|
263
263
|
end
|
264
264
|
|
265
265
|
def collection_url(options = {})
|
266
266
|
if parent?
|
267
|
-
|
267
|
+
routes_proxy.polymorphic_url([:admin, parent, model_class], options)
|
268
268
|
else
|
269
|
-
|
269
|
+
routes_proxy.polymorphic_url([:admin, model_class], options)
|
270
270
|
end
|
271
271
|
end
|
272
272
|
|
273
|
+
def routes_proxy
|
274
|
+
spree
|
275
|
+
end
|
276
|
+
|
273
277
|
# Allow all attributes to be updatable.
|
274
278
|
#
|
275
279
|
# Other controllers can, should, override it to set custom logic
|
@@ -40,24 +40,33 @@ module Spree
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def load_stock_management_data
|
43
|
-
@stock_locations = Spree::StockLocation.accessible_by(current_ability)
|
44
|
-
@stock_item_stock_locations =
|
43
|
+
@stock_locations = Spree::StockLocation.accessible_by(current_ability, :read)
|
44
|
+
@stock_item_stock_locations = Spree::DeprecatedInstanceVariableProxy.new(
|
45
|
+
view_context,
|
46
|
+
:@stock_locations,
|
47
|
+
:stock_item_stock_locations,
|
48
|
+
Spree.deprecator,
|
49
|
+
"Please, do not use @stock_item_stock_locations anymore in the views, use @stock_locations",
|
50
|
+
)
|
45
51
|
@variant_display_attributes = self.class.variant_display_attributes
|
46
|
-
@variants = Spree::Config.variant_search_class.new(params[:variant_search_term], scope: variant_scope).results
|
47
|
-
|
48
|
-
@variants = @variants.includes(option_values: :option_type)
|
49
|
-
@variants = @variants.order(id: :desc).page(params[:page]).per(params[:per_page] || Spree::Config[:orders_per_page])
|
52
|
+
@variants = Spree::Config.variant_search_class.new(params[:variant_search_term], scope: variant_scope).results.
|
53
|
+
order(id: :desc).page(params[:page]).per(params[:per_page] || Spree::Config[:orders_per_page])
|
50
54
|
end
|
51
55
|
|
52
56
|
def variant_scope
|
53
|
-
scope = Spree::Variant
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
57
|
+
scope = Spree::Variant
|
58
|
+
.accessible_by(current_ability)
|
59
|
+
.distinct.order(:sku)
|
60
|
+
.includes(
|
61
|
+
:images,
|
62
|
+
stock_items: :stock_location,
|
63
|
+
product: :variant_images,
|
64
|
+
option_values: :option_type
|
58
65
|
)
|
59
|
-
|
60
|
-
scope = scope.
|
66
|
+
|
67
|
+
scope = scope.where(product: @product, is_master: !@product.has_variants?) if @product
|
68
|
+
scope = scope.by_stock_location(params[:stock_location_id]) if params[:stock_location_id].present?
|
69
|
+
|
61
70
|
scope
|
62
71
|
end
|
63
72
|
|
@@ -42,45 +42,49 @@ module Spree
|
|
42
42
|
# Make an admin tab that covers one or more resources supplied by symbols
|
43
43
|
# Option hash may follow. Valid options are
|
44
44
|
# * :label to override link text, otherwise based on the first resource name (translated)
|
45
|
-
# * :route to override automatically determining the default route
|
46
45
|
# * :match_path as an alternative way to control when the tab is active, /products would match /admin/products, /admin/products/5/variants etc.
|
47
46
|
# * :match_path can also be a callable that takes a request and determines whether the menu item is selected for the request.
|
48
|
-
|
49
|
-
|
47
|
+
# * :selected to explicitly control whether the tab is active
|
48
|
+
def tab(*args, &block)
|
49
|
+
options = args.last.is_a?(Hash) ? args.pop.dup : {}
|
50
|
+
css_classes = Array(options[:css_class])
|
51
|
+
|
52
|
+
if options.key?(:route)
|
53
|
+
Spree.deprecator.warn "Passing a route to #tab is deprecated. Please pass a url instead."
|
54
|
+
options[:url] ||= spree.send("#{options[:route]}_path")
|
55
|
+
end
|
50
56
|
|
51
|
-
if args.
|
52
|
-
|
57
|
+
if args.any?
|
58
|
+
Spree.deprecator.warn "Passing resources to #tab is deprecated. Please use the `label:` and `match_path:` options instead."
|
59
|
+
options[:label] ||= args.first
|
60
|
+
options[:url] ||= spree.send("admin_#{args.first}_path")
|
61
|
+
options[:selected] = args.include?(controller.controller_name.to_sym)
|
53
62
|
end
|
54
|
-
options[:route] ||= "admin_#{args.first}"
|
55
63
|
|
56
|
-
|
64
|
+
options[:url] ||= spree.send("admin_#{options[:label]}_path")
|
57
65
|
label = t(options[:label], scope: [:spree, :admin, :tab])
|
58
66
|
|
59
|
-
|
67
|
+
options[:selected] ||=
|
68
|
+
if options[:match_path].is_a? Regexp
|
69
|
+
request.fullpath =~ options[:match_path]
|
70
|
+
elsif options[:match_path].respond_to?(:call)
|
71
|
+
options[:match_path].call(request)
|
72
|
+
elsif options[:match_path]
|
73
|
+
request.fullpath.starts_with?("#{spree.admin_path}#{options[:match_path]}")
|
74
|
+
else
|
75
|
+
request.fullpath.starts_with?(options[:url])
|
76
|
+
end
|
77
|
+
|
78
|
+
css_classes << 'selected' if options[:selected]
|
60
79
|
|
61
80
|
if options[:icon]
|
62
|
-
link = link_to_with_icon(options[:icon], label,
|
81
|
+
link = link_to_with_icon(options[:icon], label, options[:url])
|
63
82
|
css_classes << 'tab-with-icon'
|
64
83
|
else
|
65
|
-
link = link_to(label,
|
66
|
-
end
|
67
|
-
|
68
|
-
selected = if options[:match_path].is_a? Regexp
|
69
|
-
request.fullpath =~ options[:match_path]
|
70
|
-
elsif options[:match_path].respond_to?(:call)
|
71
|
-
options[:match_path].call(request)
|
72
|
-
elsif options[:match_path]
|
73
|
-
request.fullpath.starts_with?("#{spree.admin_path}#{options[:match_path]}")
|
74
|
-
else
|
75
|
-
request.fullpath.starts_with?(destination_url) ||
|
76
|
-
args.include?(controller.controller_name.to_sym)
|
84
|
+
link = link_to(label, options[:url])
|
77
85
|
end
|
78
|
-
|
79
|
-
|
80
|
-
if options[:css_class]
|
81
|
-
css_classes << options[:css_class]
|
82
|
-
end
|
83
|
-
content_tag('li', link + (yield if block_given?), class: css_classes.join(' ') )
|
86
|
+
block_content = capture(&block) if block_given?
|
87
|
+
content_tag('li', link + block_content.to_s, class: css_classes.join(' ') )
|
84
88
|
end
|
85
89
|
|
86
90
|
def link_to_clone(resource, options = {})
|
@@ -115,12 +119,25 @@ module Spree
|
|
115
119
|
end
|
116
120
|
|
117
121
|
def link_to_with_icon(icon_name, text, url, options = {})
|
118
|
-
options[:class] =
|
122
|
+
options[:class] = "#{options[:class]} icon_link with-tip".strip
|
123
|
+
|
124
|
+
if icon_name.starts_with?('ri-')
|
125
|
+
svg_map = image_path('spree/backend/themes/solidus_admin/remixicon.symbol.svg')
|
126
|
+
icon_tag = tag.svg(
|
127
|
+
tag.use('xlink:href': "#{svg_map}##{icon_name}"),
|
128
|
+
'aria-hidden': true,
|
129
|
+
style: "fill: currentColor;",
|
130
|
+
)
|
131
|
+
else
|
132
|
+
options[:class] << " fa fa-#{icon_name}"
|
133
|
+
icon_tag = ''.html_safe
|
134
|
+
end
|
135
|
+
|
119
136
|
options[:class] += ' no-text' if options[:no_text]
|
120
137
|
options[:title] = text if options[:no_text]
|
121
138
|
text = options[:no_text] ? '' : content_tag(:span, text, class: 'text')
|
122
139
|
options.delete(:no_text)
|
123
|
-
link_to(text, url, options)
|
140
|
+
link_to(icon_tag + text, url, options)
|
124
141
|
end
|
125
142
|
|
126
143
|
def solidus_icon(icon_name)
|
@@ -0,0 +1,101 @@
|
|
1
|
+
<% default_store = Spree::Store.default %>
|
2
|
+
|
3
|
+
<div class="solidus-admin--nav--wrapper">
|
4
|
+
<aside class="solidus-admin--nav">
|
5
|
+
<header class="solidus-admin--nav--section">
|
6
|
+
<%= link_to spree.admin_path, class: 'solidus-admin--nav--logo' do %>
|
7
|
+
<%= image_tag(Spree::Config[:admin_interface_logo]) %>
|
8
|
+
<%- end %>
|
9
|
+
|
10
|
+
<%= link_to "//#{default_store.url}", target: '_blank', class: 'solidus-admin--nav--store-link' do %>
|
11
|
+
<div style="flex-grow: 1">
|
12
|
+
<span class="solidus-admin--nav--store-link--name"><%= default_store.name %></span>
|
13
|
+
<span class="solidus-admin--nav--store-link--url"><%= default_store.url %></span>
|
14
|
+
</div>
|
15
|
+
<svg aria-hidden="true"><use xlink:href="<%= image_path('spree/backend/themes/solidus_admin/remixicon.symbol.svg') %>#ri-arrow-right-up-line"></use></svg>
|
16
|
+
<% end %>
|
17
|
+
</header>
|
18
|
+
|
19
|
+
<nav class="solidus-admin--nav--section">
|
20
|
+
<ul class="solidus-admin--nav--menu">
|
21
|
+
<%= render 'spree/admin/shared/tabs' %>
|
22
|
+
</ul>
|
23
|
+
</nav>
|
24
|
+
|
25
|
+
<footer class="solidus-admin--nav--section">
|
26
|
+
<% if defined? SolidusAdmin %>
|
27
|
+
<ul class="solidus-admin--nav--menu">
|
28
|
+
<li class="tab-with-icon">
|
29
|
+
<label class="icon_link with-tip">
|
30
|
+
<span
|
31
|
+
id="solidus-admin-switch-label"
|
32
|
+
class="text"
|
33
|
+
data-legacy-label="<%= 'spree.navigation.switch_to_legacy'.then { t(_1, default: t(_1, locale: :en)) } %>"
|
34
|
+
data-admin-label="<%= 'spree.navigation.switch_to_solidus_admin'.then { t(_1, default: t(_1, locale: :en)) } %>"
|
35
|
+
></span>
|
36
|
+
<span><input type="checkbox" id="solidus-admin-switch" class="solidus-admin--nav--switch"/></span>
|
37
|
+
</label>
|
38
|
+
</li>
|
39
|
+
</ul>
|
40
|
+
<% end %>
|
41
|
+
|
42
|
+
<% if spree_current_user %>
|
43
|
+
<details class="solidus-admin--nav--footer" aria-label="Account">
|
44
|
+
<summary>
|
45
|
+
<svg aria-hidden="true"><use xlink:href="<%= image_path('spree/backend/themes/solidus_admin/remixicon.symbol.svg') %>#ri-user-smile-fill"></use></svg>
|
46
|
+
<div>
|
47
|
+
<%= spree_current_user&.email || "Test user" %>
|
48
|
+
</div>
|
49
|
+
</summary>
|
50
|
+
|
51
|
+
<ul>
|
52
|
+
<% if (available_locales = Spree.i18n_available_locales).any? %>
|
53
|
+
<li>
|
54
|
+
<label>
|
55
|
+
<svg aria-hidden="true"><use xlink:href="<%= image_path('spree/backend/themes/solidus_admin/remixicon.symbol.svg') %>#ri-global-line"></use></svg>
|
56
|
+
<select class="js-locale-selection">
|
57
|
+
<%= options_for_select(
|
58
|
+
available_locales
|
59
|
+
.map do |locale|
|
60
|
+
[
|
61
|
+
t(
|
62
|
+
"spree.i18n.this_file_language",
|
63
|
+
locale: locale,
|
64
|
+
default: locale.to_s,
|
65
|
+
fallback: false
|
66
|
+
),
|
67
|
+
locale
|
68
|
+
]
|
69
|
+
end
|
70
|
+
.sort,
|
71
|
+
selected: I18n.locale
|
72
|
+
) %>
|
73
|
+
</select>
|
74
|
+
<svg aria-hidden="true"><use xlink:href="<%= image_path('spree/backend/themes/solidus_admin/remixicon.symbol.svg') %>#ri-expand-up-down-line"></use></svg>
|
75
|
+
</label>
|
76
|
+
</li>
|
77
|
+
<% end %>
|
78
|
+
|
79
|
+
<% if can?(:admin, spree_current_user) %>
|
80
|
+
<li data-hook="user-account-link">
|
81
|
+
<%= link_to(spree.edit_admin_user_path(spree_current_user)) do %>
|
82
|
+
<svg aria-hidden="true"><use xlink:href="<%= image_path('spree/backend/themes/solidus_admin/remixicon.symbol.svg') %>#ri-user-3-line"></use></svg>
|
83
|
+
<span><%= t('spree.my_account') %></span>
|
84
|
+
<% end %>
|
85
|
+
</li>
|
86
|
+
<% end %>
|
87
|
+
|
88
|
+
<% if spree.respond_to? :admin_logout_path %>
|
89
|
+
<li data-hook="user-logout-link">
|
90
|
+
<%= link_to spree.admin_logout_path, method: Devise.sign_out_via, rel: "nofollow" do %>
|
91
|
+
<svg aria-hidden="true"><use xlink:href="<%= image_path('spree/backend/themes/solidus_admin/remixicon.symbol.svg') %>#ri-logout-box-line"></use></svg>
|
92
|
+
<span><%= t("spree.logout") %></span>
|
93
|
+
<% end %>
|
94
|
+
</li>
|
95
|
+
<% end %>
|
96
|
+
</ul>
|
97
|
+
</details>
|
98
|
+
<% end %>
|
99
|
+
</footer>
|
100
|
+
</aside>
|
101
|
+
</div>
|
@@ -1,17 +1,19 @@
|
|
1
|
+
<% Spree.deprecator.warn "Using the #{@virtual_path.inspect} partial is deprecated, please use MenuItem#children instead." %>
|
2
|
+
|
1
3
|
<ul class="admin-subnav" data-hook="admin_product_sub_tabs">
|
2
4
|
<% if can? :admin, Spree::Product %>
|
3
|
-
<%= tab :products, match_path: '/products' %>
|
5
|
+
<%= tab label: :products, match_path: '/products' %>
|
4
6
|
<% end %>
|
5
7
|
<% if can? :admin, Spree::OptionType %>
|
6
|
-
<%= tab :option_types, match_path: '/option_types' %>
|
8
|
+
<%= tab label: :option_types, match_path: '/option_types' %>
|
7
9
|
<% end %>
|
8
10
|
<% if can? :admin, Spree::Property %>
|
9
|
-
<%= tab :properties %>
|
11
|
+
<%= tab label: :properties %>
|
10
12
|
<% end %>
|
11
13
|
<% if can? :admin, Spree::Taxonomy %>
|
12
|
-
<%= tab :taxonomies %>
|
14
|
+
<%= tab label: :taxonomies %>
|
13
15
|
<% end %>
|
14
16
|
<% if can? :admin, Spree::Taxon %>
|
15
|
-
<%= tab :
|
17
|
+
<%= tab url: spree.admin_taxons_path, label: :display_order, match_path: '/taxons' %>
|
16
18
|
<% end %>
|
17
19
|
</ul>
|
@@ -1,8 +1,10 @@
|
|
1
|
+
<% Spree.deprecator.warn "Using the #{@virtual_path.inspect} partial is deprecated, please use MenuItem#children instead." %>
|
2
|
+
|
1
3
|
<ul class="admin-subnav" data-hook="admin_promotion_sub_tabs">
|
2
4
|
<% if can? :admin, Spree::Promotion %>
|
3
|
-
<%= tab :promotions %>
|
5
|
+
<%= tab label: :promotions %>
|
4
6
|
<% end %>
|
5
7
|
<% if can? :admin, Spree::PromotionCategory %>
|
6
|
-
<%= tab :promotion_categories %>
|
8
|
+
<%= tab label: :promotion_categories %>
|
7
9
|
<% end %>
|
8
10
|
</ul>
|
@@ -1,26 +1,28 @@
|
|
1
|
+
<% Spree.deprecator.warn "Using the #{@virtual_path.inspect} partial is deprecated, please use MenuItem#children instead." %>
|
2
|
+
|
1
3
|
<ul class="admin-subnav" data-hook="admin_settings_sub_tabs">
|
2
4
|
<% if can?(:admin, Spree::Store) %>
|
3
|
-
<%= tab
|
5
|
+
<%= tab label: :stores, url: spree.admin_stores_path %>
|
4
6
|
<% end %>
|
5
7
|
|
6
8
|
<% if can?(:admin, Spree::PaymentMethod) %>
|
7
|
-
<%= tab :payments, url: spree.admin_payment_methods_path %>
|
9
|
+
<%= tab label: :payments, url: spree.admin_payment_methods_path %>
|
8
10
|
<% end %>
|
9
11
|
|
10
12
|
<% if can?(:admin, Spree::TaxCategory) || can?(:admin, Spree::TaxRate) %>
|
11
|
-
<%= tab :taxes, url: spree.admin_tax_categories_path, match_path: %r(tax_categories|tax_rates) %>
|
13
|
+
<%= tab label: :taxes, url: spree.admin_tax_categories_path, match_path: %r(tax_categories|tax_rates) %>
|
12
14
|
<% end %>
|
13
15
|
|
14
16
|
<% if can?(:admin, Spree::RefundReason) || can?(:admin, Spree::ReimbursementType) ||
|
15
17
|
can?(:show, Spree::ReturnReason) || can?(:show, Spree::AdjustmentReason) %>
|
16
|
-
<%= tab :checkout, url: spree.admin_refund_reasons_path, match_path: %r(refund_reasons|reimbursement_types|return_reasons|adjustment_reasons|store_credit_reasons) %>
|
18
|
+
<%= tab label: :checkout, url: spree.admin_refund_reasons_path, match_path: %r(refund_reasons|reimbursement_types|return_reasons|adjustment_reasons|store_credit_reasons) %>
|
17
19
|
<% end %>
|
18
20
|
|
19
21
|
<% if can?(:admin, Spree::ShippingMethod) || can?(:admin, Spree::ShippingCategory) || can?(:admin, Spree::StockLocation) %>
|
20
|
-
<%= tab :shipping, url: spree.admin_shipping_methods_path, match_path: %r(shipping_methods|shipping_categories|stock_locations) %>
|
22
|
+
<%= tab label: :shipping, url: spree.admin_shipping_methods_path, match_path: %r(shipping_methods|shipping_categories|stock_locations) %>
|
21
23
|
<% end %>
|
22
24
|
|
23
25
|
<% if can?(:admin, Spree::Zone) %>
|
24
|
-
<%= tab :zones, url: spree.admin_zones_path %>
|
26
|
+
<%= tab label: :zones, url: spree.admin_zones_path %>
|
25
27
|
<% end %>
|
26
28
|
</ul>
|
@@ -1,15 +1,27 @@
|
|
1
|
-
<% Spree::Backend::Config.menu_items.
|
2
|
-
<% if
|
1
|
+
<% Spree::Backend::Config.menu_items.each do |menu_item| %>
|
2
|
+
<% if menu_item.render_in?(self) %>
|
3
3
|
<%=
|
4
4
|
tab(
|
5
|
-
*menu_item.sections,
|
6
5
|
icon: menu_item.icon,
|
7
6
|
label: menu_item.label,
|
8
|
-
url: menu_item.url
|
9
|
-
|
7
|
+
url: menu_item.url,
|
8
|
+
selected: menu_item.match_path?(request) || menu_item.children.any? { _1.match_path?(request) },
|
10
9
|
) do
|
11
10
|
%>
|
12
|
-
|
11
|
+
<% if menu_item.render_partial? %>
|
12
|
+
<%- render partial: menu_item.partial %>
|
13
|
+
<% elsif menu_item.children.present? %>
|
14
|
+
<ul class="admin-subnav" data-hook="<%= menu_item.data_hook %>">
|
15
|
+
<%- menu_item.children.each do |child| %>
|
16
|
+
<%= tab(
|
17
|
+
icon: child.icon,
|
18
|
+
label: child.label,
|
19
|
+
url: child.url,
|
20
|
+
selected: child.match_path?(request),
|
21
|
+
) if child.render_in?(self) %>
|
22
|
+
<% end %>
|
23
|
+
</ul>
|
24
|
+
<% end %>
|
13
25
|
<%- end %>
|
14
26
|
<% end %>
|
15
27
|
<% end %>
|
@@ -4,7 +4,14 @@
|
|
4
4
|
<div class="field-block col-3">
|
5
5
|
<div class="field">
|
6
6
|
<%= label_tag nil, Spree::StockLocation.model_name.human %>
|
7
|
-
<%= select_tag
|
7
|
+
<%= select_tag(
|
8
|
+
:stock_location_id,
|
9
|
+
options_from_collection_for_select(stock_locations, :id, :name, params[:stock_location_id]),
|
10
|
+
include_blank: t('spree.all'),
|
11
|
+
class: 'select2 fullwidth',
|
12
|
+
"data-placeholder" => t('spree.select_a_stock_location'),
|
13
|
+
multiple: true,
|
14
|
+
) %>
|
8
15
|
</div>
|
9
16
|
</div>
|
10
17
|
<div class="<%= if content_for?(:sidebar) then 'col-6' else 'col-9' end %>">
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<% admin_layout "full-width" %>
|
2
2
|
|
3
|
-
<%= paginate
|
3
|
+
<%= paginate variants, theme: "solidus_admin" %>
|
4
4
|
|
5
5
|
<table class="index stock-table" id="listing_product_stock">
|
6
6
|
<colgroup>
|
@@ -71,18 +71,30 @@
|
|
71
71
|
<col style="width: 15%">
|
72
72
|
</colgroup>
|
73
73
|
<% variant.stock_items.each do |item| %>
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
74
|
+
<tr
|
75
|
+
class="js-edit-stock-item stock-item-edit-row"
|
76
|
+
data-variant-id="<%= variant.id %>"
|
77
|
+
data-stock-item="<%= item.to_json %>"
|
78
|
+
data-stock-location-name="<%= item.stock_location.name %>"
|
79
|
+
data-track-inventory="<%= variant.should_track_inventory? %>"
|
80
|
+
data-can-edit="<%= can?(:admin, Spree::StockItem) %>"
|
81
|
+
data-variant-sku="<%= variant.sku %>"
|
82
|
+
>
|
83
|
+
<%# This is rendered in JS %>
|
84
|
+
</tr>
|
79
85
|
<% end %>
|
80
|
-
<% locations_without_items =
|
86
|
+
<% locations_without_items = stock_locations - variant.stock_items.flat_map(&:stock_location) %>
|
81
87
|
<% if locations_without_items.any? && can?(:create, Spree::StockItem) %>
|
82
88
|
<tr class="js-add-stock-item stock-item-edit-row" data-variant-id="<%= variant.id %>">
|
83
89
|
<form>
|
84
90
|
<td class='location-name-cell'>
|
85
|
-
<%= select_tag
|
91
|
+
<%= select_tag(
|
92
|
+
:stock_location_id,
|
93
|
+
options_from_collection_for_select(locations_without_items, :id, :name),
|
94
|
+
class: 'custom-select',
|
95
|
+
prompt: t('spree.add_to_stock_location'),
|
96
|
+
id: "variant-stock-location-#{variant.id}",
|
97
|
+
) %>
|
86
98
|
</td>
|
87
99
|
<td class="align-center">
|
88
100
|
<%= check_box_tag :backorderable, 'backorderable', false, id: "variant-backorderable-#{variant.id}" %>
|
@@ -104,4 +116,4 @@
|
|
104
116
|
<% end %>
|
105
117
|
</table>
|
106
118
|
|
107
|
-
<%= paginate
|
119
|
+
<%= paginate variants, theme: "solidus_admin" %>
|
@@ -19,7 +19,10 @@
|
|
19
19
|
<% end %>
|
20
20
|
|
21
21
|
<% if @variants.any? %>
|
22
|
-
<%= render partial: 'stock_management', locals: {
|
22
|
+
<%= render partial: 'stock_management', locals: {
|
23
|
+
variants: @variants,
|
24
|
+
stock_locations: @stock_locations,
|
25
|
+
} %>
|
23
26
|
<% else %>
|
24
27
|
<div class="fullwidth no-objects-found">
|
25
28
|
<%= t('spree.no_variants_found_try_again') %>
|
@@ -3,8 +3,12 @@
|
|
3
3
|
<head data-hook="admin_inside_head">
|
4
4
|
<%= render 'spree/admin/shared/head' %>
|
5
5
|
</head>
|
6
|
-
<body class="admin <%= "admin-nav-hidden" if cookies[:admin_nav_hidden] == "true" %>">
|
7
|
-
|
6
|
+
<body class="admin <%= "admin-nav-hidden" if !Spree::Backend::Config.admin_updated_navbar && cookies[:admin_nav_hidden] == "true" %>">
|
7
|
+
<% if Spree::Backend::Config.admin_updated_navbar %>
|
8
|
+
<%= render partial: 'spree/admin/shared/navigation_solidus_admin' %>
|
9
|
+
<% else %>
|
10
|
+
<%= render "spree/admin/shared/navigation" %>
|
11
|
+
<% end %>
|
8
12
|
<%= render "spree/admin/shared/header" %>
|
9
13
|
<%= render "spree/admin/shared/flash" %>
|
10
14
|
<%= render "spree/admin/shared/spinner" %>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Spree.deprecator.warn(
|
4
|
+
"Spree::BackendConfiguration::*_TABS is deprecated. Please use Spree::BackendConfiguration::MenuItem(match_path:) instead."
|
5
|
+
)
|
6
|
+
|
7
|
+
Spree::BackendConfiguration::ORDER_TABS ||= [
|
8
|
+
:orders, :payments, :creditcard_payments,
|
9
|
+
:shipments, :credit_cards, :return_authorizations,
|
10
|
+
:customer_returns, :adjustments, :customer_details
|
11
|
+
]
|
12
|
+
Spree::BackendConfiguration::PRODUCT_TABS ||= [
|
13
|
+
:products, :option_types, :properties,
|
14
|
+
:variants, :product_properties, :taxonomies,
|
15
|
+
:taxons
|
16
|
+
]
|
17
|
+
Spree::BackendConfiguration::PROMOTION_TABS ||= [
|
18
|
+
:promotions, :promotion_categories
|
19
|
+
]
|
20
|
+
Spree::BackendConfiguration::STOCK_TABS ||= [
|
21
|
+
:stock_items
|
22
|
+
]
|
23
|
+
Spree::BackendConfiguration::USER_TABS ||= [
|
24
|
+
:users, :store_credits
|
25
|
+
]
|
26
|
+
Spree::BackendConfiguration::CONFIGURATION_TABS ||= [
|
27
|
+
:stores, :tax_categories,
|
28
|
+
:tax_rates, :zones,
|
29
|
+
:payment_methods, :shipping_methods,
|
30
|
+
:shipping_categories, :stock_locations,
|
31
|
+
:refund_reasons, :reimbursement_types,
|
32
|
+
:return_reasons, :adjustment_reasons,
|
33
|
+
:store_credit_reasons
|
34
|
+
]
|