spree_backend 3.0.10 → 3.1.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree/backend.js +22 -19
  3. data/app/assets/javascripts/spree/backend/admin.js +10 -17
  4. data/app/assets/javascripts/spree/backend/handlebar_extensions.js +0 -2
  5. data/app/assets/javascripts/spree/backend/product_picker.js +1 -2
  6. data/app/assets/javascripts/spree/backend/spree-select2.js +0 -1
  7. data/app/assets/javascripts/spree/backend/taxon_autocomplete.js +1 -0
  8. data/app/assets/javascripts/spree/backend/taxons.js.coffee +6 -1
  9. data/app/assets/stylesheets/spree/backend/components/_labels.scss +1 -0
  10. data/app/assets/stylesheets/spree/backend/components/_page_header.scss +15 -0
  11. data/app/assets/stylesheets/spree/backend/shared/_base.scss +9 -1
  12. data/app/assets/stylesheets/spree/backend/shared/_forms.scss +5 -1
  13. data/app/controllers/spree/admin/adjustments_controller.rb +2 -2
  14. data/app/controllers/spree/admin/customer_returns_controller.rb +5 -4
  15. data/app/controllers/spree/admin/option_types_controller.rb +1 -1
  16. data/app/controllers/spree/admin/option_values_controller.rb +1 -1
  17. data/app/controllers/spree/admin/orders/customer_details_controller.rb +37 -20
  18. data/app/controllers/spree/admin/orders_controller.rb +6 -6
  19. data/app/controllers/spree/admin/payment_methods_controller.rb +3 -3
  20. data/app/controllers/spree/admin/payments_controller.rb +2 -2
  21. data/app/controllers/spree/admin/products_controller.rb +11 -2
  22. data/app/controllers/spree/admin/promotions_controller.rb +0 -2
  23. data/app/controllers/spree/admin/properties_controller.rb +0 -2
  24. data/app/controllers/spree/admin/resource_controller.rb +6 -7
  25. data/app/controllers/spree/admin/return_index_controller.rb +28 -0
  26. data/app/controllers/spree/admin/stock_transfers_controller.rb +2 -4
  27. data/app/controllers/spree/admin/store_credit_categories_controller.rb +6 -0
  28. data/app/controllers/spree/admin/store_credits_controller.rb +94 -0
  29. data/app/controllers/spree/admin/taxons_controller.rb +14 -12
  30. data/app/controllers/spree/admin/users_controller.rb +4 -25
  31. data/app/controllers/spree/admin/variants_controller.rb +7 -4
  32. data/app/helpers/spree/admin/base_helper.rb +9 -0
  33. data/app/helpers/spree/admin/navigation_helper.rb +19 -8
  34. data/app/helpers/spree/admin/orders_helper.rb +11 -7
  35. data/app/views/spree/admin/countries/edit.html.erb +4 -0
  36. data/app/views/spree/admin/countries/new.html.erb +1 -1
  37. data/app/views/spree/admin/general_settings/edit.html.erb +19 -18
  38. data/app/views/spree/admin/option_types/edit.html.erb +2 -0
  39. data/app/views/spree/admin/option_types/new.html.erb +4 -0
  40. data/app/views/spree/admin/orders/_add_line_item.html.erb +3 -3
  41. data/app/views/spree/admin/orders/_add_product.html.erb +3 -3
  42. data/app/views/spree/admin/orders/_form.html.erb +22 -22
  43. data/app/views/spree/admin/orders/_line_items.html.erb +5 -5
  44. data/app/views/spree/admin/orders/_line_items_edit_form.html.erb +19 -19
  45. data/app/views/spree/admin/orders/_order_actions.html.erb +12 -0
  46. data/app/views/spree/admin/orders/_risk_analysis.html.erb +2 -2
  47. data/app/views/spree/admin/orders/cart.html.erb +7 -11
  48. data/app/views/spree/admin/orders/customer_details/_form.html.erb +4 -4
  49. data/app/views/spree/admin/orders/customer_details/edit.html.erb +3 -3
  50. data/app/views/spree/admin/orders/edit.html.erb +6 -10
  51. data/app/views/spree/admin/orders/index.html.erb +7 -5
  52. data/app/views/spree/admin/payment_methods/_form.html.erb +1 -1
  53. data/app/views/spree/admin/payment_methods/edit.html.erb +4 -0
  54. data/app/views/spree/admin/payment_methods/index.html.erb +8 -2
  55. data/app/views/spree/admin/payment_methods/new.html.erb +4 -0
  56. data/app/views/spree/admin/payments/index.html.erb +1 -1
  57. data/app/views/spree/admin/payments/source_forms/_storecredit.html.erb +9 -0
  58. data/app/views/spree/admin/payments/source_views/_storecredit.html.erb +29 -0
  59. data/app/views/spree/admin/products/_form.html.erb +12 -3
  60. data/app/views/spree/admin/products/edit.html.erb +1 -0
  61. data/app/views/spree/admin/products/index.html.erb +10 -0
  62. data/app/views/spree/admin/products/new.html.erb +4 -0
  63. data/app/views/spree/admin/promotion_categories/edit.html.erb +4 -0
  64. data/app/views/spree/admin/promotion_categories/new.html.erb +4 -0
  65. data/app/views/spree/admin/promotions/edit.html.erb +4 -0
  66. data/app/views/spree/admin/promotions/new.html.erb +4 -0
  67. data/app/views/spree/admin/properties/edit.html.erb +4 -0
  68. data/app/views/spree/admin/properties/new.html.erb +4 -0
  69. data/app/views/spree/admin/prototypes/edit.html.erb +4 -0
  70. data/app/views/spree/admin/prototypes/new.html.erb +4 -0
  71. data/app/views/spree/admin/refund_reasons/destroy.js.erb +1 -0
  72. data/app/views/spree/admin/reports/sales_total.html.erb +1 -1
  73. data/app/views/spree/admin/return_authorization_reasons/destroy.js.erb +1 -0
  74. data/app/views/spree/admin/return_index/customer_returns.html.erb +64 -0
  75. data/app/views/spree/admin/return_index/return_authorizations.html.erb +76 -0
  76. data/app/views/spree/admin/roles/edit.html.erb +4 -0
  77. data/app/views/spree/admin/roles/new.html.erb +4 -0
  78. data/app/views/spree/admin/shared/_destroy.js.erb +6 -3
  79. data/app/views/spree/admin/shared/_error_messages.html.erb +1 -1
  80. data/app/views/spree/admin/shared/_index_table_options.html.erb +7 -1
  81. data/app/views/spree/admin/shared/_main_menu.html.erb +6 -0
  82. data/app/views/spree/admin/shared/_order_tabs.html.erb +1 -1
  83. data/app/views/spree/admin/shared/named_types/_index.html.erb +2 -1
  84. data/app/views/spree/admin/shared/sub_menu/_configuration.html.erb +1 -0
  85. data/app/views/spree/admin/shared/sub_menu/_returns.html.erb +4 -0
  86. data/app/views/spree/admin/shipping_categories/edit.html.erb +4 -0
  87. data/app/views/spree/admin/shipping_categories/new.html.erb +4 -0
  88. data/app/views/spree/admin/state_changes/index.html.erb +2 -2
  89. data/app/views/spree/admin/states/edit.html.erb +4 -0
  90. data/app/views/spree/admin/states/new.html.erb +4 -0
  91. data/app/views/spree/admin/stock_locations/edit.html.erb +1 -1
  92. data/app/views/spree/admin/stock_movements/_form.html.erb +3 -3
  93. data/app/views/spree/admin/stock_movements/edit.html.erb +2 -1
  94. data/app/views/spree/admin/stock_movements/index.html.erb +2 -2
  95. data/app/views/spree/admin/stock_movements/new.html.erb +4 -4
  96. data/app/views/spree/admin/store_credit_categories/_form.html.erb +8 -0
  97. data/app/views/spree/admin/store_credit_categories/edit.html.erb +10 -0
  98. data/app/views/spree/admin/store_credit_categories/index.html.erb +34 -0
  99. data/app/views/spree/admin/store_credit_categories/new.html.erb +10 -0
  100. data/app/views/spree/admin/store_credits/_form.html.erb +18 -0
  101. data/app/views/spree/admin/store_credits/edit.html.erb +12 -0
  102. data/app/views/spree/admin/store_credits/index.html.erb +46 -0
  103. data/app/views/spree/admin/store_credits/new.html.erb +12 -0
  104. data/app/views/spree/admin/tax_categories/edit.html.erb +1 -1
  105. data/app/views/spree/admin/tax_categories/new.html.erb +1 -1
  106. data/app/views/spree/admin/tax_rates/edit.html.erb +4 -0
  107. data/app/views/spree/admin/tax_rates/index.html.erb +1 -1
  108. data/app/views/spree/admin/tax_rates/new.html.erb +4 -0
  109. data/app/views/spree/admin/taxonomies/edit.erb +5 -1
  110. data/app/views/spree/admin/taxonomies/new.html.erb +4 -0
  111. data/app/views/spree/admin/taxons/_form.html.erb +1 -1
  112. data/app/views/spree/admin/users/_form.html.erb +5 -6
  113. data/app/views/spree/admin/users/_lifetime_stats.html.erb +6 -2
  114. data/app/views/spree/admin/users/_sidebar.html.erb +3 -0
  115. data/app/views/spree/admin/users/_user_page_actions.html.erb +1 -1
  116. data/app/views/spree/admin/users/items.html.erb +1 -1
  117. data/app/views/spree/admin/users/new.html.erb +4 -0
  118. data/app/views/spree/admin/users/orders.html.erb +1 -1
  119. data/app/views/spree/admin/variants/_form.html.erb +8 -1
  120. data/app/views/spree/admin/variants/index.html.erb +4 -2
  121. data/app/views/spree/admin/zones/index.html.erb +1 -1
  122. data/config/routes.rb +19 -9
  123. data/lib/spree/backend/callbacks.rb +4 -8
  124. data/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb +164 -9
  125. data/spec/controllers/spree/admin/orders_controller_spec.rb +16 -9
  126. data/spec/controllers/spree/admin/payments_controller_spec.rb +10 -10
  127. data/spec/controllers/spree/admin/products_controller_spec.rb +61 -12
  128. data/spec/controllers/spree/admin/return_index_controller_spec.rb +37 -0
  129. data/spec/controllers/spree/admin/users_controller_spec.rb +3 -3
  130. data/spec/features/admin/configuration/analytics_tracker_spec.rb +3 -2
  131. data/spec/features/admin/configuration/countries_spec.rb +1 -1
  132. data/spec/features/admin/configuration/general_settings_spec.rb +1 -0
  133. data/spec/features/admin/configuration/payment_methods_spec.rb +4 -4
  134. data/spec/features/admin/configuration/store_credit_categories_spec.rb +50 -0
  135. data/spec/features/admin/homepage_spec.rb +19 -11
  136. data/spec/features/admin/orders/cancelling_and_resuming_spec.rb +2 -2
  137. data/spec/features/admin/orders/customer_details_spec.rb +8 -21
  138. data/spec/features/admin/orders/line_items_spec.rb +2 -2
  139. data/spec/features/admin/orders/listing_spec.rb +3 -6
  140. data/spec/features/admin/orders/new_order_spec.rb +13 -14
  141. data/spec/features/admin/orders/payments_spec.rb +1 -1
  142. data/spec/features/admin/products/products_spec.rb +2 -2
  143. data/spec/features/admin/products/stock_management_spec.rb +5 -4
  144. data/spec/features/admin/refund_reasons/refund_reasons_spec.rb +57 -0
  145. data/spec/features/admin/reports_spec.rb +2 -2
  146. data/spec/features/admin/return_authorization_reasons/return_authorization_reasons_spec.rb +63 -0
  147. data/spec/features/admin/returns/customer_returns_spec.rb +80 -0
  148. data/spec/features/admin/returns/return_authorizations_spec.rb +152 -0
  149. data/spec/features/admin/store_credits_spec.rb +93 -0
  150. data/spec/features/admin/users_spec.rb +8 -6
  151. data/spec/helpers/admin/base_helper_spec.rb +6 -0
  152. data/spec/routing/admin_path_spec.rb +22 -0
  153. data/spec/spec_helper.rb +1 -0
  154. data/spree_backend.gemspec +0 -1
  155. metadata +36 -10
  156. data/CHANGELOG.md +0 -1
@@ -11,7 +11,7 @@ module Spree
11
11
  respond_to :html
12
12
 
13
13
  def index
14
- @payments = @order.payments.includes(:refunds => :reason)
14
+ @payments = @order.payments.includes(refunds: :reason)
15
15
  @refunds = @payments.flat_map(&:refunds)
16
16
  redirect_to new_admin_order_payment_url(@order) if @payments.empty?
17
17
  end
@@ -77,7 +77,7 @@ module Spree
77
77
 
78
78
  def load_data
79
79
  @amount = params[:amount] || load_order.total
80
- @payment_methods = PaymentMethod.available(:back_end)
80
+ @payment_methods = PaymentMethod.available_on_back_end
81
81
  if @payment and @payment.payment_method
82
82
  @payment_method = @payment.payment_method
83
83
  else
@@ -44,9 +44,18 @@ module Spree
44
44
 
45
45
  def destroy
46
46
  @product = Product.friendly.find(params[:id])
47
- @product.destroy
48
47
 
49
- flash[:success] = Spree.t('notice_messages.product_deleted')
48
+ begin
49
+ # TODO: why is @product.destroy raising ActiveRecord::RecordNotDestroyed instead of failing with false result
50
+ # Issue found for above comment: https://github.com/rails/rails/issues/19761
51
+ if @product.destroy
52
+ flash[:success] = Spree.t('notice_messages.product_deleted')
53
+ else
54
+ flash[:error] = @object.errors.full_messages.join(', ')
55
+ end
56
+ rescue ActiveRecord::RecordNotDestroyed => e
57
+ flash[:error] = Spree.t('notice_messages.product_not_deleted')
58
+ end
50
59
 
51
60
  respond_with(@product) do |format|
52
61
  format.html { redirect_to collection_url }
@@ -26,8 +26,6 @@ module Spree
26
26
  includes(promotion_includes).
27
27
  page(params[:page]).
28
28
  per(params[:per_page] || Spree::Config[:promotions_per_page])
29
-
30
- @collection
31
29
  end
32
30
 
33
31
  def promotion_includes
@@ -17,8 +17,6 @@ module Spree
17
17
  @collection = @search.result.
18
18
  page(params[:page]).
19
19
  per(Spree::Config[:properties_per_page])
20
-
21
- @collection
22
20
  end
23
21
  end
24
22
  end
@@ -88,15 +88,14 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
88
88
  if @object.destroy
89
89
  invoke_callbacks(:destroy, :after)
90
90
  flash[:success] = flash_message_for(@object, :successfully_removed)
91
- respond_with(@object) do |format|
92
- format.html { redirect_to location_after_destroy }
93
- format.js { render :partial => "spree/admin/shared/destroy" }
94
- end
95
91
  else
96
92
  invoke_callbacks(:destroy, :fails)
97
- respond_with(@object) do |format|
98
- format.html { redirect_to location_after_destroy }
99
- end
93
+ flash[:error] = @object.errors.full_messages.join(', ')
94
+ end
95
+
96
+ respond_with(@object) do |format|
97
+ format.html { redirect_to location_after_destroy }
98
+ format.js { render_js_for_destroy }
100
99
  end
101
100
  end
102
101
 
@@ -0,0 +1,28 @@
1
+ module Spree
2
+ module Admin
3
+ class ReturnIndexController < BaseController
4
+ def return_authorizations
5
+ collection(Spree::ReturnAuthorization)
6
+ respond_with(@collection)
7
+ end
8
+
9
+ def customer_returns
10
+ collection(Spree::CustomerReturn)
11
+ respond_with(@collection)
12
+ end
13
+
14
+ private
15
+
16
+ def collection(resource)
17
+ return @collection if @collection.present?
18
+ params[:q] ||= {}
19
+
20
+ @collection = resource.all
21
+ # @search needs to be defined as this is passed to search_form_for
22
+ @search = @collection.ransack(params[:q])
23
+ per_page = params[:per_page] || Spree::Config[:admin_products_per_page]
24
+ @collection = @search.result.order(created_at: :desc).page(params[:page]).per(per_page)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -8,7 +8,7 @@ module Spree
8
8
 
9
9
  @stock_transfers = @q.result.
10
10
  includes(stock_movements: { stock_item: :stock_location }).
11
- order('created_at DESC').
11
+ order(created_at: :desc).
12
12
  page(params[:page])
13
13
  end
14
14
 
@@ -16,9 +16,7 @@ module Spree
16
16
  @stock_transfer = StockTransfer.friendly.find(params[:id])
17
17
  end
18
18
 
19
- def new
20
-
21
- end
19
+ def new; end
22
20
 
23
21
  def create
24
22
  variants = Hash.new(0)
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ module Admin
3
+ class StoreCreditCategoriesController < ResourceController
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,94 @@
1
+ module Spree
2
+ module Admin
3
+ class StoreCreditError < StandardError; end
4
+
5
+ class StoreCreditsController < Spree::Admin::BaseController
6
+ before_action :load_user
7
+ before_action :load_categories, only: [:new, :edit]
8
+ before_action :load_store_credit, only: [:new, :edit, :update]
9
+ before_action :ensure_unused_store_credit, only: [:update]
10
+
11
+ def index
12
+ @store_credits = @user.store_credits.includes(:credit_type, :category).reverse_order
13
+ end
14
+
15
+ def create
16
+ @store_credit = @user.store_credits.build(
17
+ permitted_store_credit_params.merge(
18
+ created_by: try_spree_current_user,
19
+ action_originator: try_spree_current_user
20
+ )
21
+ )
22
+
23
+ if @store_credit.save
24
+ flash[:success] = flash_message_for(@store_credit, :successfully_created)
25
+ redirect_to admin_user_store_credits_path(@user)
26
+ else
27
+ load_categories
28
+ flash[:error] = Spree.t('store_credit.errors.unable_to_create')
29
+ render :new
30
+ end
31
+ end
32
+
33
+ def update
34
+ @store_credit.assign_attributes(permitted_store_credit_params)
35
+ @store_credit.created_by = try_spree_current_user
36
+
37
+ if @store_credit.save
38
+ flash[:success] = flash_message_for(@store_credit, :successfully_updated)
39
+ redirect_to admin_user_store_credits_path(@user)
40
+ else
41
+ load_categories
42
+ flash[:error] = Spree.t('store_credit.errors.unable_to_update')
43
+ render :edit
44
+ end
45
+ end
46
+
47
+ def destroy
48
+ @store_credit = @user.store_credits.find(params[:id])
49
+ ensure_unused_store_credit
50
+
51
+ if @store_credit.destroy
52
+ respond_with(@store_credit) do |format|
53
+ format.html { redirect_to admin_user_store_credits_path(@user) }
54
+ format.js { render_js_for_destroy }
55
+ end
56
+ else
57
+ render text: Spree.t('store_credit.errors.unable_to_delete'), status: :unprocessable_entity
58
+ end
59
+ end
60
+
61
+ protected
62
+
63
+ def permitted_store_credit_params
64
+ params.require(:store_credit).permit(permitted_store_credit_attributes).
65
+ merge(currency: Spree::Config[:currency])
66
+ end
67
+
68
+ private
69
+
70
+ def load_user
71
+ @user = Spree.user_class.find_by(id: params[:user_id])
72
+
73
+ unless @user
74
+ flash[:error] = Spree.t(:user_not_found)
75
+ redirect_to admin_path
76
+ end
77
+ end
78
+
79
+ def load_categories
80
+ @credit_categories = Spree::StoreCreditCategory.order(:name)
81
+ end
82
+
83
+ def load_store_credit
84
+ @store_credit = Spree::StoreCredit.find_by_id(params[:id]) || Spree::StoreCredit.new
85
+ end
86
+
87
+ def ensure_unused_store_credit
88
+ unless @store_credit.amount_used.zero?
89
+ raise StoreCreditError.new(Spree.t('store_credit.errors.cannot_change_used_store_credit'))
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -12,9 +12,9 @@ module Spree
12
12
 
13
13
  def search
14
14
  if params[:ids]
15
- @taxons = Spree::Taxon.where(:id => params[:ids].split(','))
15
+ @taxons = Spree::Taxon.where(id: params[:ids].split(','))
16
16
  else
17
- @taxons = Spree::Taxon.limit(20).ransack(:name_cont => params[:q]).result
17
+ @taxons = Spree::Taxon.limit(20).ransack(name_cont: params[:q]).result
18
18
  end
19
19
  end
20
20
 
@@ -22,7 +22,7 @@ module Spree
22
22
  @taxon = @taxonomy.taxons.build(params[:taxon])
23
23
  if @taxon.save
24
24
  respond_with(@taxon) do |format|
25
- format.json {render :json => @taxon.to_json }
25
+ format.json { render json: @taxon.to_json }
26
26
  end
27
27
  else
28
28
  flash[:error] = Spree.t('errors.messages.could_not_create_taxon')
@@ -59,15 +59,15 @@ module Spree
59
59
  rename_child_taxons if @update_children
60
60
 
61
61
  respond_with(@taxon) do |format|
62
- format.html {redirect_to edit_admin_taxonomy_url(@taxonomy) }
63
- format.json {render :json => @taxon.to_json }
62
+ format.html { redirect_to edit_admin_taxonomy_url(@taxonomy) }
63
+ format.json { render json: @taxon.to_json }
64
64
  end
65
65
  end
66
66
 
67
67
  def destroy
68
68
  @taxon = Taxon.find(params[:id])
69
69
  @taxon.destroy
70
- respond_with(@taxon) { |format| format.json { render :json => '' } }
70
+ respond_with(@taxon) { |format| format.json { render json: '' } }
71
71
  end
72
72
 
73
73
  private
@@ -107,18 +107,20 @@ module Spree
107
107
 
108
108
  def rename_child_taxons
109
109
  @taxon.descendants.each do |taxon|
110
- taxon.reload
111
- taxon.set_permalink
112
- taxon.save!
110
+ reload_taxon_and_set_permalink(taxon)
113
111
  end
114
112
  end
115
113
 
116
114
  def regenerate_permalink
117
- @taxon.reload
118
- @taxon.set_permalink
119
- @taxon.save!
115
+ reload_taxon_and_set_permalink(@taxon)
120
116
  @update_children = true
121
117
  end
118
+
119
+ def reload_taxon_and_set_permalink(taxon)
120
+ taxon.reload
121
+ taxon.set_permalink
122
+ taxon.save!
123
+ end
122
124
  end
123
125
  end
124
126
  end
@@ -7,8 +7,6 @@ module Spree
7
7
 
8
8
  # http://spreecommerce.com/blog/2010/11/02/json-hijacking-vulnerability/
9
9
  before_action :check_json_authenticity, only: :index
10
- before_action :load_roles
11
- before_action :extract_roles_from_params, only: [:create, :update]
12
10
 
13
11
  def index
14
12
  respond_with(@collection) do |format|
@@ -22,11 +20,8 @@ module Spree
22
20
  end
23
21
 
24
22
  def create
25
-
26
23
  @user = Spree.user_class.new(user_params)
27
24
  if @user.save
28
- set_roles
29
-
30
25
  flash.now[:success] = flash_message_for(@user, :successfully_created)
31
26
  render :edit
32
27
  else
@@ -41,7 +36,6 @@ module Spree
41
36
  end
42
37
 
43
38
  if @user.update_attributes(user_params)
44
- set_roles
45
39
  flash.now[:success] = Spree.t(:account_updated)
46
40
  end
47
41
 
@@ -95,8 +89,9 @@ module Spree
95
89
 
96
90
  def collection
97
91
  return @collection if @collection.present?
92
+ @collection = super
98
93
  if request.xhr? && params[:q].present?
99
- @collection = Spree.user_class.includes(:bill_address, :ship_address)
94
+ @collection = @collection.includes(:bill_address, :ship_address)
100
95
  .where("spree_users.email #{LIKE} :search
101
96
  OR (spree_addresses.firstname #{LIKE} :search AND spree_addresses.id = spree_users.bill_address_id)
102
97
  OR (spree_addresses.lastname #{LIKE} :search AND spree_addresses.id = spree_users.bill_address_id)
@@ -105,28 +100,16 @@ module Spree
105
100
  { :search => "#{params[:q].strip}%" })
106
101
  .limit(params[:limit] || 100)
107
102
  else
108
- @search = Spree.user_class.ransack(params[:q])
103
+ @search = @collection.ransack(params[:q])
109
104
  @collection = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
110
105
  end
111
106
  end
112
107
 
113
108
  private
114
109
 
115
- def set_roles
116
- if @roles_ids
117
- @user.spree_roles = Spree::Role.where(id: @roles_ids)
118
- end
119
- end
120
-
121
- def extract_roles_from_params
122
- if params[:user]
123
- @roles_ids = params[:user].delete("spree_role_ids")
124
- end
125
- end
126
-
127
110
  def user_params
128
111
  params.require(:user).permit(permitted_user_attributes |
129
- [:spree_role_ids,
112
+ [spree_role_ids: [],
130
113
  ship_address_attributes: permitted_address_attributes,
131
114
  bill_address_attributes: permitted_address_attributes])
132
115
  end
@@ -157,10 +140,6 @@ module Spree
157
140
  sign_in(@user, event: :authentication, bypass: true)
158
141
  end
159
142
  end
160
-
161
- def load_roles
162
- @roles = Spree::Role.all
163
- end
164
143
  end
165
144
  end
166
145
  end
@@ -23,10 +23,13 @@ module Spree
23
23
 
24
24
  protected
25
25
  def new_before
26
- @object.attributes = @object.product.master.attributes.except('id', 'created_at', 'deleted_at',
26
+ master = @object.product.master
27
+ @object.attributes = master.attributes.except('id', 'created_at', 'deleted_at',
27
28
  'sku', 'is_master')
28
- # Shallow Clone of the default price to populate the price field.
29
- @object.default_price = @object.product.master.default_price.clone
29
+ if master.default_price.present?
30
+ # Shallow Clone of the default price to populate the price field.
31
+ @object.default_price = master.default_price.clone
32
+ end
30
33
  end
31
34
 
32
35
  def collection
@@ -35,7 +38,7 @@ module Spree
35
38
  if @deleted.blank?
36
39
  @collection ||= super.includes(:default_price, option_values: :option_type)
37
40
  else
38
- @collection ||= Variant.only_deleted.where(:product_id => parent.id)
41
+ @collection ||= Variant.only_deleted.where(product_id: parent.id)
39
42
  end
40
43
  @collection
41
44
  end
@@ -144,6 +144,15 @@ module Spree
144
144
  resource_class.model_name.human(count: I18N_PLURAL_MANY_COUNT)
145
145
  end
146
146
 
147
+ def back_to_list_button(resource, path)
148
+ button_text = Spree.t(:back_to_resource_list, resource: resource)
149
+ link_to_with_icon 'arrow-left', button_text, path, class: 'btn btn-default'
150
+ end
151
+
152
+ def order_time(time)
153
+ [I18n.l(time.to_date), time.strftime("%l:%M %p")].join('')
154
+ end
155
+
147
156
  private
148
157
  def attribute_name_for(field_name)
149
158
  field_name.gsub(' ', '_').downcase
@@ -1,11 +1,20 @@
1
1
  module Spree
2
2
  module Admin
3
3
  module NavigationHelper
4
- # Make an admin tab that coveres one or more resources supplied by symbols
4
+ # Makes an admin navigation tab (<li> tag) that links to a routing resource under /admin.
5
+ # The arguments should be a list of symbolized controller names that will cause this tab to
6
+ # be highlighted, with the first being the name of the resouce to link (uses URL helpers).
7
+ #
5
8
  # Option hash may follow. Valid options are
6
9
  # * :label to override link text, otherwise based on the first resource name (translated)
7
10
  # * :route to override automatically determining the default route
8
- # * :match_path as an alternative way to control when the tab is active, /products would match /admin/products, /admin/products/5/variants etc.
11
+ # * :match_path as an alternative way to control when the tab is active, /products would
12
+ # match /admin/products, /admin/products/5/variants etc. Can be a String or a Regexp.
13
+ # Controller names are ignored if :match_path is provided.
14
+ #
15
+ # Example:
16
+ # # Link to /admin/orders, also highlight tab for ProductsController and ShipmentsController
17
+ # tab :orders, :products, :shipments
9
18
  def tab(*args)
10
19
  options = { label: args.first.to_s }
11
20
 
@@ -92,8 +101,8 @@ module Spree
92
101
 
93
102
  # helper method to create proper url to apply per page filtering
94
103
  # fixes https://github.com/spree/spree/issues/6888
95
- def per_page_dropdown_params
96
- args = params.clone
104
+ def per_page_dropdown_params(args = nil)
105
+ args ||= params.clone
97
106
  args.delete(:page)
98
107
  args.delete(:per_page)
99
108
  args
@@ -116,9 +125,11 @@ module Spree
116
125
  end
117
126
 
118
127
  def link_to_clone(resource, options={})
119
- options[:data] = { action: 'clone' }
120
- options[:class] = "btn btn-primary btn-sm"
121
- link_to_with_icon('clone', Spree.t(:clone), clone_object_url(resource), options)
128
+ options[:data] = { action: 'clone', :'original-title' => Spree.t(:clone) }
129
+ options[:class] = "btn btn-primary btn-sm with-tip"
130
+ options[:method] = :post
131
+ options[:icon] = :clone
132
+ button_link_to '', clone_object_url(resource), options
122
133
  end
123
134
 
124
135
  def link_to_new(resource)
@@ -177,7 +188,7 @@ module Spree
177
188
  if (html_options[:method] &&
178
189
  html_options[:method].to_s.downcase != 'get' &&
179
190
  !html_options[:remote])
180
- form_tag(url, method: html_options.delete(:method)) do
191
+ form_tag(url, method: html_options.delete(:method), class: 'display-inline') do
181
192
  button(text, html_options.delete(:icon), nil, html_options)
182
193
  end
183
194
  else