spree_backend 4.2.0.rc2 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree/backend.js +1 -2
  3. data/app/assets/javascripts/spree/backend/address_states.js +20 -9
  4. data/app/assets/javascripts/spree/backend/admin.js +9 -15
  5. data/app/assets/javascripts/spree/backend/calculator.js +2 -0
  6. data/app/assets/javascripts/spree/backend/checkouts/edit.js +99 -71
  7. data/app/assets/javascripts/spree/backend/line_items_on_order_edit.js +1 -1
  8. data/app/assets/javascripts/spree/backend/option_type_autocomplete.js +31 -37
  9. data/app/assets/javascripts/spree/backend/option_value_picker.js +50 -23
  10. data/app/assets/javascripts/spree/backend/product_picker.js +35 -19
  11. data/app/assets/javascripts/spree/backend/promotions.js +32 -27
  12. data/app/assets/javascripts/spree/backend/shipments.js +28 -37
  13. data/app/assets/javascripts/spree/backend/spree-select2.js +33 -14
  14. data/app/assets/javascripts/spree/backend/stock_transfer.js +32 -13
  15. data/app/assets/javascripts/spree/backend/taxon_autocomplete.js +30 -43
  16. data/app/assets/javascripts/spree/backend/taxons.js +60 -47
  17. data/app/assets/javascripts/spree/backend/user_picker.js +16 -18
  18. data/app/assets/javascripts/spree/backend/variant_autocomplete.js +23 -22
  19. data/app/assets/stylesheets/spree/backend/components/_badges.scss +1 -1
  20. data/app/assets/stylesheets/spree/backend/components/_tables.scss +2 -2
  21. data/app/assets/stylesheets/spree/backend/global/_mixins.scss +19 -0
  22. data/app/assets/stylesheets/spree/backend/global/_variables.scss +1 -1
  23. data/app/assets/stylesheets/spree/backend/plugins/_flatpickr.scss +94 -76
  24. data/app/assets/stylesheets/spree/backend/plugins/_select2_custom.scss +11 -0
  25. data/app/assets/stylesheets/spree/backend/plugins/select2_bootstrap4.scss +622 -0
  26. data/app/assets/stylesheets/spree/backend/shared/_base.scss +4 -0
  27. data/app/assets/stylesheets/spree/backend/spree_admin.css.scss +3 -1
  28. data/app/controllers/spree/admin/base_controller.rb +2 -0
  29. data/app/controllers/spree/admin/general_settings_controller.rb +1 -1
  30. data/app/controllers/spree/admin/images_controller.rb +3 -3
  31. data/app/controllers/spree/admin/orders/customer_details_controller.rb +1 -1
  32. data/app/controllers/spree/admin/orders_controller.rb +15 -2
  33. data/app/controllers/spree/admin/prices_controller.rb +0 -13
  34. data/app/controllers/spree/admin/products_controller.rb +2 -2
  35. data/app/controllers/spree/admin/states_controller.rb +1 -1
  36. data/app/controllers/spree/admin/stores_controller.rb +7 -14
  37. data/app/controllers/spree/admin/taxons_controller.rb +15 -5
  38. data/app/helpers/spree/admin/base_helper.rb +68 -6
  39. data/app/helpers/spree/admin/navigation_helper.rb +11 -1
  40. data/app/helpers/spree/admin/payments_helper.rb +3 -3
  41. data/app/helpers/spree/admin/stock_movements_helper.rb +2 -0
  42. data/app/views/kaminari/admin-twitter-bootstrap-4/_first_page.html.erb +2 -2
  43. data/app/views/kaminari/admin-twitter-bootstrap-4/_gap.html.erb +2 -2
  44. data/app/views/kaminari/admin-twitter-bootstrap-4/_last_page.html.erb +2 -2
  45. data/app/views/kaminari/admin-twitter-bootstrap-4/_next_page.html.erb +2 -2
  46. data/app/views/kaminari/admin-twitter-bootstrap-4/_page.html.erb +2 -2
  47. data/app/views/kaminari/admin-twitter-bootstrap-4/_paginator.html.erb +2 -2
  48. data/app/views/kaminari/admin-twitter-bootstrap-4/_prev_page.html.erb +2 -2
  49. data/app/views/spree/admin/adjustments/index.html.erb +2 -2
  50. data/app/views/spree/admin/countries/index.html.erb +6 -6
  51. data/app/views/spree/admin/customer_returns/_return_item_decision.html.erb +48 -46
  52. data/app/views/spree/admin/customer_returns/_return_item_selection.html.erb +3 -1
  53. data/app/views/spree/admin/customer_returns/edit.html.erb +1 -1
  54. data/app/views/spree/admin/customer_returns/index.html.erb +2 -2
  55. data/app/views/spree/admin/customer_returns/new.html.erb +1 -1
  56. data/app/views/spree/admin/general_settings/edit.html.erb +27 -4
  57. data/app/views/spree/admin/images/edit.html.erb +1 -1
  58. data/app/views/spree/admin/log_entries/index.html.erb +1 -1
  59. data/app/views/spree/admin/option_types/index.html.erb +2 -2
  60. data/app/views/spree/admin/orders/_add_line_item.html.erb +1 -1
  61. data/app/views/spree/admin/orders/_add_product.html.erb +1 -1
  62. data/app/views/spree/admin/orders/_adjustments.html.erb +2 -2
  63. data/app/views/spree/admin/orders/_channel_form.html.erb +18 -0
  64. data/app/views/spree/admin/orders/_form.html.erb +6 -10
  65. data/app/views/spree/admin/orders/_line_items.html.erb +1 -1
  66. data/app/views/spree/admin/orders/_line_items_edit_form.html.erb +5 -8
  67. data/app/views/spree/admin/orders/_order_actions.html.erb +1 -2
  68. data/app/views/spree/admin/orders/_risk_analysis.html.erb +3 -3
  69. data/app/views/spree/admin/orders/_shipment.html.erb +3 -2
  70. data/app/views/spree/admin/orders/_shipment_manifest.html.erb +1 -1
  71. data/app/views/spree/admin/orders/cart.html.erb +1 -1
  72. data/app/views/spree/admin/orders/channel.html.erb +7 -0
  73. data/app/views/spree/admin/orders/customer_details/_autocomplete.js.erb +35 -12
  74. data/app/views/spree/admin/orders/customer_details/_form.html.erb +3 -3
  75. data/app/views/spree/admin/orders/customer_details/edit.html.erb +1 -1
  76. data/app/views/spree/admin/orders/edit.html.erb +1 -1
  77. data/app/views/spree/admin/orders/index.html.erb +12 -11
  78. data/app/views/spree/admin/payment_methods/_form.html.erb +65 -46
  79. data/app/views/spree/admin/payment_methods/index.html.erb +2 -2
  80. data/app/views/spree/admin/payments/_form.html.erb +2 -3
  81. data/app/views/spree/admin/payments/show.html.erb +1 -2
  82. data/app/views/spree/admin/payments/source_forms/_gateway.html.erb +3 -4
  83. data/app/views/spree/admin/payments/source_views/_gateway.html.erb +1 -1
  84. data/app/views/spree/admin/prices/_variant_prices.html.erb +5 -5
  85. data/app/views/spree/admin/prices/index.html.erb +2 -2
  86. data/app/views/spree/admin/product_properties/index.html.erb +3 -4
  87. data/app/views/spree/admin/products/_form.html.erb +8 -9
  88. data/app/views/spree/admin/products/index.html.erb +2 -1
  89. data/app/views/spree/admin/products/new.html.erb +5 -3
  90. data/app/views/spree/admin/products/stock.html.erb +2 -2
  91. data/app/views/spree/admin/promotion_rules/create.js.erb +1 -1
  92. data/app/views/spree/admin/promotions/_actions.html.erb +2 -3
  93. data/app/views/spree/admin/promotions/_form.html.erb +10 -11
  94. data/app/views/spree/admin/promotions/_rules.html.erb +1 -1
  95. data/app/views/spree/admin/promotions/actions/_create_adjustment.html.erb +1 -1
  96. data/app/views/spree/admin/promotions/actions/_create_item_adjustments.html.erb +1 -1
  97. data/app/views/spree/admin/promotions/actions/_create_line_items.html.erb +1 -1
  98. data/app/views/spree/admin/promotions/index.html.erb +7 -5
  99. data/app/views/spree/admin/promotions/rules/_option_value.html.erb +8 -7
  100. data/app/views/spree/admin/promotions/rules/_product.html.erb +1 -1
  101. data/app/views/spree/admin/promotions/rules/_taxon.html.erb +2 -2
  102. data/app/views/spree/admin/promotions/rules/_user.html.erb +1 -1
  103. data/app/views/spree/admin/prototypes/_form.html.erb +1 -1
  104. data/app/views/spree/admin/prototypes/show.html.erb +1 -1
  105. data/app/views/spree/admin/refunds/edit.html.erb +2 -2
  106. data/app/views/spree/admin/refunds/new.html.erb +3 -3
  107. data/app/views/spree/admin/reimbursements/edit.html.erb +5 -4
  108. data/app/views/spree/admin/reimbursements/show.html.erb +3 -1
  109. data/app/views/spree/admin/return_authorizations/_form.html.erb +7 -5
  110. data/app/views/spree/admin/return_authorizations/index.html.erb +2 -2
  111. data/app/views/spree/admin/return_index/customer_returns.html.erb +2 -2
  112. data/app/views/spree/admin/return_index/return_authorizations.html.erb +2 -2
  113. data/app/views/spree/admin/roles/index.html.erb +1 -1
  114. data/app/views/spree/admin/shared/_account_nav.html.erb +3 -3
  115. data/app/views/spree/admin/shared/_address_form.html.erb +9 -9
  116. data/app/views/spree/admin/shared/_error_messages.html.erb +1 -1
  117. data/app/views/spree/admin/shared/_head.html.erb +6 -2
  118. data/app/views/spree/admin/shared/_header.html.erb +0 -2
  119. data/app/views/spree/admin/shared/_main_menu.html.erb +1 -1
  120. data/app/views/spree/admin/shared/_order_summary.html.erb +25 -21
  121. data/app/views/spree/admin/shared/_order_tabs.html.erb +9 -0
  122. data/app/views/spree/admin/shared/_refunds.html.erb +2 -2
  123. data/app/views/spree/admin/shared/_report_order_criteria.html.erb +4 -2
  124. data/app/views/spree/admin/shared/_translations.html.erb +9 -38
  125. data/app/views/spree/admin/shared/_update_order_state.js.erb +6 -2
  126. data/app/views/spree/admin/shared/named_types/_index.html.erb +1 -1
  127. data/app/views/spree/admin/shipping_categories/index.html.erb +2 -2
  128. data/app/views/spree/admin/shipping_methods/_form.html.erb +2 -2
  129. data/app/views/spree/admin/shipping_methods/index.html.erb +7 -3
  130. data/app/views/spree/admin/states/index.html.erb +2 -2
  131. data/app/views/spree/admin/stock_locations/_form.html.erb +2 -2
  132. data/app/views/spree/admin/stock_locations/_transfer_stock_form.html.erb +1 -1
  133. data/app/views/spree/admin/stock_locations/index.html.erb +6 -6
  134. data/app/views/spree/admin/stock_movements/_form.html.erb +1 -1
  135. data/app/views/spree/admin/stock_movements/index.html.erb +2 -2
  136. data/app/views/spree/admin/stock_transfers/_stock_movements.html.erb +1 -1
  137. data/app/views/spree/admin/stock_transfers/index.html.erb +42 -37
  138. data/app/views/spree/admin/stock_transfers/new.html.erb +1 -1
  139. data/app/views/spree/admin/stock_transfers/show.html.erb +0 -1
  140. data/app/views/spree/admin/stores/_form.html.erb +83 -25
  141. data/app/views/spree/admin/stores/index.html.erb +15 -8
  142. data/app/views/spree/admin/tax_categories/index.html.erb +3 -3
  143. data/app/views/spree/admin/tax_rates/index.html.erb +8 -8
  144. data/app/views/spree/admin/taxonomies/_js_head.html.erb +1 -2
  145. data/app/views/spree/admin/taxonomies/_list.html.erb +1 -1
  146. data/app/views/spree/admin/taxons/_form.html.erb +38 -35
  147. data/app/views/spree/admin/taxons/_taxon_table.html.erb +2 -2
  148. data/app/views/spree/admin/taxons/index.html.erb +1 -1
  149. data/app/views/spree/admin/users/_addresses_form.html.erb +4 -6
  150. data/app/views/spree/admin/users/_form.html.erb +0 -1
  151. data/app/views/spree/admin/users/edit.html.erb +1 -1
  152. data/app/views/spree/admin/users/index.html.erb +2 -2
  153. data/app/views/spree/admin/users/items.html.erb +1 -1
  154. data/app/views/spree/admin/variants/_form.html.erb +5 -3
  155. data/app/views/spree/admin/zones/_country_members.html.erb +1 -1
  156. data/app/views/spree/admin/zones/_form.html.erb +2 -2
  157. data/app/views/spree/admin/zones/index.html.erb +1 -1
  158. data/app/views/spree/admin/zones/new.html.erb +1 -1
  159. data/app/views/spree/layouts/admin.html.erb +2 -3
  160. data/config/initializers/assets.rb +1 -1
  161. data/config/routes.rb +7 -1
  162. data/spree_backend.gemspec +2 -2
  163. metadata +20 -20
  164. data/app/assets/javascripts/spree/backend/flatpickr_locals.js +0 -37
  165. data/app/assets/javascripts/spree/backend/tag_picker.js +0 -52
  166. data/app/assets/stylesheets/spree/backend/plugins/_select2.scss +0 -190
  167. data/app/helpers/spree/admin/currency_helper.rb +0 -14
  168. data/app/views/spree/admin/general_settings/_form.html.erb +0 -17
@@ -55,3 +55,7 @@
55
55
  .resize-animation-stopper * {
56
56
  transition: none !important;
57
57
  }
58
+
59
+ .button_to {
60
+ display: inline-block;
61
+ }
@@ -1,4 +1,5 @@
1
1
  @import 'global/variables';
2
+ @import 'global/mixins';
2
3
 
3
4
  @import 'bootstrap';
4
5
  @import 'glyphicons';
@@ -18,9 +19,10 @@
18
19
  @import 'components/progress';
19
20
  @import 'components/spinner';
20
21
 
21
- @import 'plugins/select2';
22
22
  @import 'plugins/jquery_ui';
23
23
  @import 'plugins/flatpickr';
24
+ @import 'plugins/select2_bootstrap4';
25
+ @import 'plugins/select2_custom';
24
26
 
25
27
  @import 'shared/base';
26
28
  @import 'shared/forms';
@@ -2,6 +2,8 @@ module Spree
2
2
  module Admin
3
3
  class BaseController < Spree::BaseController
4
4
  helper 'spree/admin/navigation'
5
+ helper 'spree/locale'
6
+ helper 'spree/currency'
5
7
  layout 'spree/layouts/admin'
6
8
 
7
9
  before_action :authorize_admin
@@ -27,7 +27,7 @@ module Spree
27
27
  end
28
28
 
29
29
  def render(*args)
30
- @preferences_currency |= [:show_store_currency_selector]
30
+ @preferences_currency |= [:show_store_selector]
31
31
  super
32
32
  end
33
33
 
@@ -18,15 +18,15 @@ module Spree
18
18
  end
19
19
 
20
20
  def load_index_data
21
- @product = Product.friendly.includes(*variant_index_includes).find(params[:product_id])
21
+ @product = Product.friendly.preload(*variant_index_includes).find(params[:product_id])
22
22
  end
23
23
 
24
24
  def load_edit_data
25
- @product = Product.friendly.includes(*variant_edit_includes).find(params[:product_id])
25
+ @product = Product.friendly.preload(*variant_edit_includes).find(params[:product_id])
26
26
  @variants = @product.variants.map do |variant|
27
27
  [variant.sku_and_options_text, variant.id]
28
28
  end
29
- @variants.insert(0, [Spree.t(:all), @product.master.id])
29
+ @variants.insert(0, [Spree.t(:all), @product.master_id])
30
30
  end
31
31
 
32
32
  def set_viewable
@@ -11,7 +11,7 @@ module Spree
11
11
  end
12
12
 
13
13
  def edit
14
- country_id = Address.default.country.id
14
+ country_id = Address.default.country_id
15
15
  @order.build_bill_address(country_id: country_id) if @order.bill_address.nil?
16
16
  @order.build_ship_address(country_id: country_id) if @order.ship_address.nil?
17
17
 
@@ -2,7 +2,10 @@ module Spree
2
2
  module Admin
3
3
  class OrdersController < Spree::Admin::BaseController
4
4
  before_action :initialize_order_events
5
- before_action :load_order, only: [:edit, :update, :cancel, :resume, :approve, :resend, :open_adjustments, :close_adjustments, :cart, :store, :set_store]
5
+ before_action :load_order, only: %i[
6
+ edit update cancel resume approve resend open_adjustments
7
+ close_adjustments cart store set_store channel set_channel
8
+ ]
6
9
 
7
10
  respond_to :html
8
11
 
@@ -144,11 +147,21 @@ module Spree
144
147
  redirect_to store_admin_order_url(@order)
145
148
  end
146
149
 
150
+ def set_channel
151
+ if @order.update(order_params)
152
+ flash[:success] = flash_message_for(@order, :successfully_updated)
153
+ else
154
+ flash[:error] = @order.errors.full_messages.join(', ')
155
+ end
156
+
157
+ redirect_to channel_admin_order_url(@order)
158
+ end
159
+
147
160
  private
148
161
 
149
162
  def order_params
150
163
  params[:created_by_id] = try_spree_current_user.try(:id)
151
- params.permit(:created_by_id, :user_id, :store_id)
164
+ params.permit(:created_by_id, :user_id, :store_id, :channel)
152
165
  end
153
166
 
154
167
  def load_order
@@ -3,8 +3,6 @@ module Spree
3
3
  class PricesController < ResourceController
4
4
  belongs_to 'spree/product', find_by: :slug
5
5
 
6
- helper_method :supported_currencies_for_all_stores
7
-
8
6
  def create
9
7
  params.require(:vp).permit!
10
8
  params[:vp].each do |variant_id, prices|
@@ -23,17 +21,6 @@ module Spree
23
21
  flash[:success] = Spree.t('notice_messages.prices_saved')
24
22
  redirect_to admin_product_path(parent)
25
23
  end
26
-
27
- private
28
-
29
- def supported_currencies_for_all_stores
30
- @supported_currencies_for_all_stores = begin
31
- (
32
- Spree::Store.pluck(:supported_currencies).map { |c| c&.split(',') }.flatten + Spree::Store.pluck(:default_currency)
33
- ).
34
- compact.uniq.map { |code| ::Money::Currency.find(code.strip) }
35
- end
36
- end
37
24
  end
38
25
  end
39
26
  end
@@ -20,10 +20,10 @@ module Spree
20
20
 
21
21
  def update
22
22
  if params[:product][:taxon_ids].present?
23
- params[:product][:taxon_ids] = params[:product][:taxon_ids].split(',')
23
+ params[:product][:taxon_ids] = params[:product][:taxon_ids].reject(&:empty?)
24
24
  end
25
25
  if params[:product][:option_type_ids].present?
26
- params[:product][:option_type_ids] = params[:product][:option_type_ids].split(',')
26
+ params[:product][:option_type_ids] = params[:product][:option_type_ids].reject(&:empty?)
27
27
  end
28
28
  invoke_callbacks(:update, :before)
29
29
  if @object.update(permitted_resource_params)
@@ -22,7 +22,7 @@ module Spree
22
22
  end
23
23
 
24
24
  def load_data
25
- @countries = Country.order(:name)
25
+ @countries = Spree::Country.where(states_required: true).order(:name)
26
26
  end
27
27
  end
28
28
  end
@@ -5,16 +5,11 @@ module Spree
5
5
  before_action :set_default_currency, only: :new
6
6
  before_action :set_default_locale, only: :new
7
7
  before_action :normalize_supported_currencies, only: [:create, :update]
8
+ before_action :normalize_supported_locales, only: [:create, :update]
8
9
  before_action :set_default_country_id, only: :new
9
10
  before_action :load_all_countries, only: [:new, :edit, :update, :create]
10
11
  before_action :load_all_zones, only: %i[new edit]
11
12
 
12
- if defined?(SpreeI18n)
13
- include SpreeI18n::LocaleHelper
14
- end
15
-
16
- helper_method :all_locales_options
17
-
18
13
  def index
19
14
  if params[:ids]
20
15
  load_stores_by_ids
@@ -133,16 +128,14 @@ module Spree
133
128
  end
134
129
  end
135
130
 
136
- def set_default_country_id
137
- @store.default_country_id = Spree::Config[:default_country_id]
131
+ def normalize_supported_locales
132
+ if params[:store][:supported_locales]&.is_a?(Array)
133
+ params[:store][:supported_locales] = params[:store][:supported_locales].compact.uniq.reject(&:blank?).join(',')
134
+ end
138
135
  end
139
136
 
140
- # this method is overriten by spree_i18n to add support for more locales
141
- # in https://github.com/spree-contrib/spree_i18n/blob/master/app/helpers/spree_i18n/locale_helper.rb#L17
142
- unless defined?(SpreeI18n)
143
- def all_locales_options
144
- [['English (EN)', :en]]
145
- end
137
+ def set_default_country_id
138
+ @store.default_country_id = Spree::Config[:default_country_id]
146
139
  end
147
140
  end
148
141
  end
@@ -1,8 +1,8 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class TaxonsController < Spree::Admin::BaseController
4
- before_action :load_taxonomy, only: [:create, :edit, :update]
5
- before_action :load_taxon, only: [:edit, :update]
4
+ before_action :load_taxonomy, only: [:create, :edit, :update, :remove_icon]
5
+ before_action :load_taxon, only: [:edit, :update, :remove_icon]
6
6
  before_action :set_permalink_part, only: [:edit, :update]
7
7
  respond_to :html, :js
8
8
 
@@ -62,10 +62,22 @@ module Spree
62
62
  end
63
63
  end
64
64
 
65
+ def remove_icon
66
+ if @taxon.icon.destroy
67
+ flash[:success] = Spree.t('notice_messages.icon_removed')
68
+ redirect_to edit_admin_taxonomy_taxon_url(@taxonomy.id, @taxon.id)
69
+ else
70
+ flash[:error] = Spree.t('errors.messages.cannot_remove_icon')
71
+ render :edit
72
+ end
73
+ end
74
+
65
75
  private
66
76
 
67
77
  def set_permalink_part
68
78
  @permalink_part = @taxon.permalink.split('/').last
79
+ @parent_permalink = @taxon.permalink.split('/')[0...-1].join('/')
80
+ @parent_permalink += '/' unless @parent_permalink.blank?
69
81
  end
70
82
 
71
83
  def taxon_params
@@ -95,9 +107,7 @@ module Spree
95
107
 
96
108
  def set_permalink_params
97
109
  if params.key? 'permalink_part'
98
- parent_permalink = @taxon.permalink.split('/')[0...-1].join('/')
99
- parent_permalink += '/' unless parent_permalink.blank?
100
- params[:taxon][:permalink] = parent_permalink + params[:permalink_part]
110
+ params[:taxon][:permalink] = @parent_permalink + params[:permalink_part]
101
111
  end
102
112
  end
103
113
 
@@ -1,6 +1,18 @@
1
1
  module Spree
2
2
  module Admin
3
3
  module BaseHelper
4
+ SELECT2_SUPPORTED_LOCALES = %w[
5
+ af ar az bg bn bs ca cs da de dsb el en eo es et eu fa fi fr gl he
6
+ hi hr hsb hu hy id is it ja ka km ko lt lv mk ms nb ne nl pa pl ps
7
+ pt pt-BR ro ru sk sl sq sr sr-Cyrl sv th tk tr uk vi zh-CN zh-TW
8
+ ].freeze
9
+
10
+ FLATPICKR_SUPPORTED_LOCALES = %w[
11
+ ar at az be bg bn bs cs cy da de eo es et fa fi fo fr ga gr he
12
+ hi hr hu id is it ja ka km ko kz lv mk mn ms my nl no pa pl pt ro ru
13
+ si sk sl sq sr sv th tr uk uz vn zh
14
+ ].freeze
15
+
4
16
  def flash_alert(flash)
5
17
  if flash.present?
6
18
  message = flash[:error] || flash[:notice] || flash[:success]
@@ -46,7 +58,7 @@ module Spree
46
58
 
47
59
  def datepicker_field_value(date)
48
60
  unless date.blank?
49
- l(date, format: Spree.t('date_picker.format', default: '%Y/%m/%d'))
61
+ l(date, format: '%Y/%m/%d')
50
62
  end
51
63
  end
52
64
 
@@ -93,7 +105,9 @@ module Spree
93
105
  class: 'input_integer form-control'
94
106
  }
95
107
  when :boolean
96
- {}
108
+ {
109
+ class: 'form-check-input'
110
+ }
97
111
  when :string
98
112
  {
99
113
  size: 10,
@@ -127,11 +141,25 @@ module Spree
127
141
 
128
142
  fields = object.preferences.keys.map do |key|
129
143
  if object.has_preference?(key)
130
- form.label("preferred_#{key}", Spree.t(key) + ': ') +
131
- preference_field_for(form, "preferred_#{key}", type: object.preference_type(key))
144
+ case key
145
+ when :currency
146
+ content_tag(:div, form.label("preferred_#{key}", Spree.t(key)) +
147
+ (form.select "preferred_#{key}", currency_options(object.preferences[key]), {}, { class: 'form-control select2' }),
148
+ class: 'form-group', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
149
+ else
150
+ if object.preference_type(key) == :boolean
151
+ content_tag(:div, preference_field_for(form, "preferred_#{key}", type: object.preference_type(key)) +
152
+ form.label("preferred_#{key}", Spree.t(key), class: 'form-check-label'),
153
+ class: 'form-group form-check', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
154
+ else
155
+ content_tag(:div, form.label("preferred_#{key}", Spree.t(key)) +
156
+ preference_field_for(form, "preferred_#{key}", type: object.preference_type(key)),
157
+ class: 'form-group', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
158
+ end
159
+ end
132
160
  end
133
161
  end
134
- safe_join(fields, '<br />'.html_safe)
162
+ safe_join(fields)
135
163
  end
136
164
 
137
165
  # renders hidden field and link to remove record using nested_attributes
@@ -163,7 +191,7 @@ module Spree
163
191
  end
164
192
 
165
193
  def required_span_tag
166
- content_tag(:span, ' *', class: 'required')
194
+ content_tag(:span, ' *', class: 'required font-weight-bold text-danger')
167
195
  end
168
196
 
169
197
  def product_preview_link(product)
@@ -185,6 +213,40 @@ module Spree
185
213
  class: 'btn-outline-secondary', icon: 'view.svg', id: 'admin_preview_taxon', target: :blank
186
214
  )
187
215
  end
216
+
217
+ def admin_logout_link
218
+ if defined?(admin_logout_path)
219
+ admin_logout_path
220
+ elsif defined?(spree_logout_path)
221
+ spree_logout_path
222
+ end
223
+ end
224
+
225
+ def select2_local_fallback
226
+ stripped_locale = I18n.locale.to_s.split('-').first
227
+
228
+ if ['zh-CN', 'zh-TW', 'sr-Cyrl', 'pt-BR'].include?(I18n.locale.to_s)
229
+ I18n.locale
230
+ elsif SELECT2_SUPPORTED_LOCALES.include? stripped_locale
231
+ stripped_locale
232
+ else
233
+ 'en'
234
+ end
235
+ end
236
+
237
+ def flatpickr_local_fallback
238
+ stripped_locale = I18n.locale.to_s.split('-').first
239
+
240
+ if I18n.locale.to_s == 'zh-TW'
241
+ # Taiwanese is a popular language in Spree,
242
+ # it has been well translated.
243
+ 'zh-tw'
244
+ elsif FLATPICKR_SUPPORTED_LOCALES.include? stripped_locale
245
+ stripped_locale
246
+ else
247
+ 'default'
248
+ end
249
+ end
188
250
  end
189
251
  end
190
252
  end
@@ -130,7 +130,7 @@ module Spree
130
130
 
131
131
  def link_to_clone(resource, options = {})
132
132
  options[:data] = { action: 'clone', 'original-title': Spree.t(:clone) }
133
- options[:class] = 'btn btn-primary btn-sm with-tip'
133
+ options[:class] = 'btn btn-warning btn-sm with-tip'
134
134
  options[:method] = :post
135
135
  options[:icon] = 'clone.svg'
136
136
  button_link_to '', clone_object_url(resource), options
@@ -251,6 +251,16 @@ module Spree
251
251
  end
252
252
  end
253
253
 
254
+ def active_badge(condition, options = {})
255
+ label = options[:label]
256
+ label ||= condition ? Spree.t(:say_yes) : Spree.t(:say_no)
257
+ css_class = condition ? 'badge-active' : 'badge-inactive'
258
+
259
+ content_tag(:strong, class: "badge #{css_class} text-uppercase") do
260
+ label
261
+ end
262
+ end
263
+
254
264
  def main_part_classes
255
265
  if cookies['sidebar-minimized'] == 'true'
256
266
  'col-12 sidebar-collapsed'
@@ -2,9 +2,9 @@ module Spree
2
2
  module Admin
3
3
  module PaymentsHelper
4
4
  def payment_method_name(payment)
5
- # HACK: to allow us to retrieve the name of a "deleted" payment method
6
- id = payment.payment_method_id
7
- Spree::PaymentMethod.find_with_destroyed(id).name
5
+ payment_method = payment.payment_method
6
+
7
+ link_to payment_method.name, spree.edit_admin_payment_method_path(payment_method)
8
8
  end
9
9
  end
10
10
  end
@@ -5,6 +5,8 @@ module Spree
5
5
  if stock_movement.originator.respond_to?(:number)
6
6
  if stock_movement.originator.respond_to?(:order)
7
7
  link_to stock_movement.originator.number, [:edit, :admin, stock_movement.originator.order]
8
+ elsif stock_movement.originator.is_a?(Spree::StockTransfer)
9
+ link_to stock_movement.originator.number, spree.admin_stock_transfer_url(stock_movement.originator)
8
10
  else
9
11
  stock_movement.originator.number
10
12
  end
@@ -4,8 +4,8 @@
4
4
  current_page: a page object for the currently displayed page
5
5
  total_pages: total number of pages
6
6
  per_page: number of items to fetch per page
7
- remote: data-remote
8
- -%>
7
+ remote: data-remote -%>
8
+
9
9
  <% unless current_page.first? %>
10
10
  <li class="first page-item">
11
11
  <%= link_to_unless current_page.first?, svg_icon(name: "double-chevron-left.svg", width: '13', height: '16', classes: 'spree-icon-arrow-left mb-0'), url, remote: remote, class: 'page-link', 'aria-label': 'First page' %>
@@ -3,8 +3,8 @@
3
3
  current_page: a page object for the currently displayed page
4
4
  total_pages: total number of pages
5
5
  per_page: number of items to fetch per page
6
- remote: data-remote
7
- -%>
6
+ remote: data-remote -%>
7
+
8
8
  <li class="page gap disabled page-item d-none d-lg-flex">
9
9
  <a href="#" onclick="return false;" class="page-link">
10
10
  <%= raw(t 'views.pagination.truncate') %>
@@ -4,8 +4,8 @@
4
4
  current_page: a page object for the currently displayed page
5
5
  total_pages: total number of pages
6
6
  per_page: number of items to fetch per page
7
- remote: data-remote
8
- -%>
7
+ remote: data-remote -%>
8
+
9
9
  <% unless current_page.last? %>
10
10
  <li class="last next page-item"><%# "next" class present for border styling in twitter bootstrap %>
11
11
  <%= link_to_unless current_page.last?, svg_icon(name: "double-chevron-right.svg", width: '13', height: '16', classes: 'spree-icon-arrow-right mb-0'), url, remote: remote, class: 'page-link', 'aria-label': 'Last page' %>