spree_backend 2.2.0 → 2.2.1

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree/backend/admin.js.erb +3 -1
  3. data/app/assets/javascripts/spree/backend/checkouts/edit.js +0 -11
  4. data/app/assets/javascripts/spree/backend/option_type_autocomplete.js.erb +4 -1
  5. data/app/assets/javascripts/spree/backend/payments/new.js +42 -12
  6. data/app/assets/javascripts/spree/backend/select_payments.js.coffee +7 -0
  7. data/app/assets/javascripts/spree/backend/shipments.js.erb +1 -1
  8. data/app/assets/javascripts/spree/backend/taxonomy.js.coffee +2 -2
  9. data/app/assets/stylesheets/spree/backend/sections/_users.scss +5 -0
  10. data/app/assets/stylesheets/spree/backend/spree_admin.scss +1 -0
  11. data/app/controllers/spree/admin/base_controller.rb +2 -0
  12. data/app/controllers/spree/admin/payments_controller.rb +9 -4
  13. data/app/controllers/spree/admin/promotions_controller.rb +18 -0
  14. data/app/controllers/spree/admin/resource_controller.rb +6 -37
  15. data/app/controllers/spree/admin/shipping_methods_controller.rb +1 -1
  16. data/app/controllers/spree/admin/stock_locations_controller.rb +11 -5
  17. data/app/controllers/spree/admin/users_controller.rb +159 -0
  18. data/app/views/spree/admin/orders/_risk_analysis.html.erb +1 -1
  19. data/app/views/spree/admin/orders/_shipment.html.erb +1 -1
  20. data/app/views/spree/admin/payments/_form.html.erb +11 -5
  21. data/app/views/spree/admin/payments/source_forms/_gateway.html.erb +20 -18
  22. data/app/views/spree/admin/promotions/index.html.erb +42 -0
  23. data/app/views/spree/admin/shared/_destroy.js.erb +0 -1
  24. data/app/views/spree/admin/shared/_tabs.html.erb +3 -0
  25. data/app/views/spree/admin/shared/_translations.html.erb +5 -0
  26. data/app/views/spree/admin/users/_addresses_form.html.erb +19 -0
  27. data/app/views/spree/admin/users/_form.html.erb +37 -0
  28. data/app/views/spree/admin/users/_sidebar.html.erb +36 -0
  29. data/app/views/spree/admin/users/_user_page_actions.html.erb +5 -0
  30. data/app/views/spree/admin/users/addresses.html.erb +24 -0
  31. data/app/views/spree/admin/users/edit.html.erb +55 -0
  32. data/app/views/spree/admin/users/index.html.erb +53 -0
  33. data/app/views/spree/admin/users/items.html.erb +74 -0
  34. data/app/views/spree/admin/users/new.html.erb +23 -0
  35. data/app/views/spree/admin/users/orders.html.erb +57 -0
  36. data/app/views/spree/admin/variants/_split.js.erb +3 -3
  37. data/config/routes.rb +11 -0
  38. data/lib/spree/backend/action_callbacks.rb +1 -1
  39. data/lib/spree/backend/callbacks.rb +47 -0
  40. data/lib/spree/backend/engine.rb +2 -0
  41. data/lib/spree/backend.rb +2 -0
  42. metadata +21 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0eb4b17ed3a2191a75982b34586811474e257424
4
- data.tar.gz: 11d1332518050f7b4cc0d918ed90202876e8fb0c
3
+ metadata.gz: b64003f2a6519db60fa7c939b19cbb0a0843f46e
4
+ data.tar.gz: 01aa9c882c54b3b5ea6ddcac76adceb038c2faa9
5
5
  SHA512:
6
- metadata.gz: 51695cae86f3f9fd40b797749b05c15d78d4d80b7c1e7f995d86e473fe00e1e34c1812a626f6f071999898ee0feec3fd391c8925c65a04fe5132627311380384
7
- data.tar.gz: 2956047cd5b1b703bd524c539f3f2b9d2dffe729a100a33119e257fbf3b58b459a5b4aa555eb80bfe6882bec038b51afd1eb2b463b4a39c9f7ff46a0d2c543f1
6
+ metadata.gz: f327dd06a82084cfe7dcbd14bf1042fc44b881d00263065a6549492ab39076a0c75ac442ebfdc8880e21975170ed876b9810813d694b56fb170438f18fdacaa3
7
+ data.tar.gz: 7704dc393a526fbc4082cb96f98c6d17f3f30caa180f996d3a700079ea5844061c30526f8b01cff747ee198576bf5ed60cf43e7fc59c1758b577ca4584de25c6
@@ -173,7 +173,9 @@ $(document).ready(function(){
173
173
  },
174
174
  dataType: 'script',
175
175
  success: function(response) {
176
- el.parents("tr").fadeOut('hide');
176
+ el.parents("tr").fadeOut('hide', function() {
177
+ $(this).remove();
178
+ });
177
179
  },
178
180
  error: function(response, textStatus, errorThrown) {
179
181
  show_flash('error', response.responseText);
@@ -1,20 +1,9 @@
1
1
  //= require_self
2
- //= require jquery.payment
3
2
  $(document).ready(function() {
4
3
  if ($('#customer_autocomplete_template').length > 0) {
5
4
  window.customerTemplate = Handlebars.compile($('#customer_autocomplete_template').text());
6
5
  }
7
6
 
8
- if ($("#card_number").is("*")) {
9
- $("#card_number").payment('formatCardNumber')
10
- $("#card_expiry").payment('formatCardExpiry')
11
- $("#card_code").payment('formatCardCVC')
12
-
13
- $("#card_number").change(function() {
14
- $("#cc_type").val($.payment.cardType(this.value))
15
- })
16
- }
17
-
18
7
  formatCustomerResult = function(customer) {
19
8
  return customerTemplate({
20
9
  customer: customer,
@@ -6,7 +6,10 @@ $(document).ready(function () {
6
6
  placeholder: Spree.translations.option_type_placeholder,
7
7
  multiple: true,
8
8
  initSelection: function (element, callback) {
9
- return $.getJSON(Spree.routes.option_type_search + '?ids=' + (element.val()), null, function (data) {
9
+ var url = Spree.url(Spree.routes.option_type_search, {
10
+ ids: element.val()
11
+ });
12
+ return $.getJSON(url, null, function (data) {
10
13
  return callback(data);
11
14
  });
12
15
  },
@@ -1,16 +1,46 @@
1
- $(document).ready(function(){
1
+ //= require jquery.payment
2
+ $(document).ready(function() {
3
+ if ($("#new_payment").is("*")) {
4
+ $(".cardNumber").payment('formatCardNumber');
5
+ $(".cardExpiry").payment('formatCardExpiry');
6
+ $(".cardCode").payment('formatCardCVC');
2
7
 
3
- $("#card_new").radioControlsVisibilityOfElement('#card_form');
8
+ $(".cardNumber").change(function() {
9
+ $(".ccType").val($.payment.cardType(this.value))
10
+ })
4
11
 
5
- $('select.jump_menu').change(function(){
6
- window.location = this.options[this.selectedIndex].value;
7
- });
12
+ $('.payment_methods_radios').click(
13
+ function() {
14
+ $('.payment-methods').hide();
15
+ if (this.checked) {
16
+ $('#payment_method_' + this.value).show();
17
+ }
18
+ }
19
+ );
8
20
 
9
- $('#cvv_link').click(function(event){
10
- window_name = 'cvv_info';
11
- window_options = 'left=20,top=20,width=500,height=500,toolbar=0,resizable=0,scrollbars=1';
12
- window.open($(this).prop('href'), window_name, window_options);
13
- event.preventDefault();
14
- });
21
+ $('.payment_methods_radios').each(
22
+ function() {
23
+ if (this.checked) {
24
+ $('#payment_method_' + this.value).show();
25
+ } else {
26
+ $('#payment_method_' + this.value).hide();
27
+ }
15
28
 
16
- });
29
+ if ($("#card_new" + this.value).is("*")) {
30
+ $("#card_new" + this.value).radioControlsVisibilityOfElement('#card_form' + this.value);
31
+ }
32
+ }
33
+ );
34
+
35
+ $('.cvvLink').click(function(event){
36
+ window_name = 'cvv_info';
37
+ window_options = 'left=20,top=20,width=500,height=500,toolbar=0,resizable=0,scrollbars=1';
38
+ window.open($(this).prop('href'), window_name, window_options);
39
+ event.preventDefault();
40
+ });
41
+
42
+ $('select.jump_menu').change(function(){
43
+ window.location = this.options[this.selectedIndex].value;
44
+ });
45
+ }
46
+ });
@@ -0,0 +1,7 @@
1
+ $ ->
2
+ if $('.new_payment').is('*')
3
+ $('.payment-method-settings fieldset').addClass('hidden').first().removeClass('hidden')
4
+ $('input[name="payment[payment_method_id]"]').click ()->
5
+ $('.payment-method-settings fieldset').addClass('hidden')
6
+ id = $(this).parents('li').data('id')
7
+ $("fieldset##{id}").removeClass('hidden')
@@ -219,7 +219,7 @@ startItemSplit = function(event){
219
219
  fadeOutTime: 50,
220
220
  intentPollInterval: 300
221
221
  });
222
- $('#item_stock_location').select2({ width: 'resolve', placeholder: 'Choose Location' });
222
+ $('#item_stock_location').select2({ width: 'resolve', placeholder: Spree.translations.item_stock_placeholder });
223
223
  }
224
224
 
225
225
  completeItemSplit = function(event) {
@@ -74,7 +74,7 @@ root.setup_taxonomy_tree = (taxonomy_id) ->
74
74
  root.base_url = Spree.url(Spree.routes.taxonomy_taxons_path)
75
75
 
76
76
  $.ajax
77
- url: base_url.path().replace("/taxons", "/jstree"),
77
+ url: Spree.url(base_url.path().replace("/taxons", "/jstree")).toString(),
78
78
  success: (taxonomy) ->
79
79
  last_rollback = null
80
80
 
@@ -83,7 +83,7 @@ root.setup_taxonomy_tree = (taxonomy_id) ->
83
83
  data: taxonomy,
84
84
  ajax:
85
85
  url: (e) ->
86
- base_url.path() + '/' + e.prop('id') + '/jstree'
86
+ Spree.url(base_url.path() + '/' + e.prop('id') + '/jstree').toString()
87
87
  themes:
88
88
  theme: "apple",
89
89
  url: Spree.url(Spree.routes.jstree_theme_path)
@@ -0,0 +1,5 @@
1
+ #listing_orders, #listing_items {
2
+ td.order-state {
3
+ height: 60px;
4
+ }
5
+ }
@@ -36,6 +36,7 @@
36
36
  @import 'spree/backend/sections/tax_zones';
37
37
  @import 'spree/backend/sections/log_entries';
38
38
  @import 'spree/backend/sections/taxons';
39
+ @import 'spree/backend/sections/users';
39
40
 
40
41
  @import 'spree/backend/hacks/mozilla';
41
42
  @import 'spree/backend/hacks/opera';
@@ -11,6 +11,7 @@ module Spree
11
11
  before_filter :authorize_admin
12
12
 
13
13
  protected
14
+
14
15
  def action
15
16
  params[:action].to_sym
16
17
  end
@@ -85,6 +86,7 @@ module Spree
85
86
  def config_locale
86
87
  Spree::Backend::Config[:locale]
87
88
  end
89
+
88
90
  end
89
91
  end
90
92
  end
@@ -1,6 +1,8 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class PaymentsController < Spree::Admin::BaseController
4
+ include Spree::Backend::Callbacks
5
+
4
6
  before_filter :load_order, :only => [:create, :new, :index, :fire]
5
7
  before_filter :load_payment, :except => [:create, :new, :index]
6
8
  before_filter :load_data
@@ -18,23 +20,27 @@ module Spree
18
20
  end
19
21
 
20
22
  def create
21
- @payment = @order.payments.build(object_params)
22
- if @payment.payment_method.is_a?(Spree::Gateway) && @payment.payment_method.payment_profiles_supported? && params[:card].present? and params[:card] != 'new'
23
- @payment.source = CreditCard.find_by_id(params[:card])
23
+ invoke_callbacks(:create, :before)
24
+ @payment ||= @order.payments.build(object_params)
25
+ if params[:card].present? and params[:card] != 'new'
26
+ @payment.source = @payment.payment_method.payment_source_class.find_by_id(params[:card])
24
27
  end
25
28
 
26
29
  begin
27
30
  if @payment.save
31
+ invoke_callbacks(:create, :after)
28
32
  # Transition order as far as it will go.
29
33
  while @order.next; end
30
34
  @payment.process! if @order.completed?
31
35
  flash[:success] = flash_message_for(@payment, :successfully_created)
32
36
  redirect_to admin_order_payments_path(@order)
33
37
  else
38
+ invoke_callbacks(:create, :fails)
34
39
  flash[:error] = Spree.t(:payment_could_not_be_created)
35
40
  render :new
36
41
  end
37
42
  rescue Spree::Core::GatewayError => e
43
+ invoke_callbacks(:create, :fails)
38
44
  flash[:error] = "#{e.message}"
39
45
  redirect_to new_admin_order_payment_path(@order)
40
46
  end
@@ -74,7 +80,6 @@ module Spree
74
80
  else
75
81
  @payment_method = @payment_methods.first
76
82
  end
77
- @previous_cards = @order.credit_cards.with_payment_profile
78
83
  end
79
84
 
80
85
  def can_transition_to_payment
@@ -13,6 +13,24 @@ module Spree
13
13
  def load_data
14
14
  @calculators = Rails.application.config.spree.calculators.promotion_actions_create_adjustments
15
15
  end
16
+
17
+ def collection
18
+ return @collection if @collection.present?
19
+ params[:q] ||= HashWithIndifferentAccess.new
20
+
21
+ @collection = super
22
+ @search = @collection.ransack(params[:q])
23
+ @collection = @search.result(distinct: true).
24
+ includes(promotion_includes).
25
+ page(params[:page]).
26
+ per(params[:per_page] || Spree::Config[:promotions_per_page])
27
+
28
+ @collection
29
+ end
30
+
31
+ def promotion_includes
32
+ [:promotion_actions]
33
+ end
16
34
  end
17
35
  end
18
36
  end
@@ -1,6 +1,6 @@
1
- require 'spree/backend/action_callbacks'
2
-
3
1
  class Spree::Admin::ResourceController < Spree::Admin::BaseController
2
+ include Spree::Backend::Callbacks
3
+
4
4
  helper_method :new_object_url, :edit_object_url, :object_url, :collection_url
5
5
  before_filter :load_resource, :except => [:update_positions]
6
6
  rescue_from ActiveRecord::RecordNotFound, :with => :resource_not_found
@@ -86,14 +86,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
86
86
 
87
87
  protected
88
88
 
89
- def resource_not_found
90
- flash[:error] = flash_message_for(model_class.new, :not_found)
91
- redirect_to collection_url
92
- end
93
-
94
89
  class << self
95
90
  attr_accessor :parent_data
96
- attr_accessor :callbacks
97
91
 
98
92
  def belongs_to(model_name, options = {})
99
93
  @parent_data ||= {}
@@ -101,26 +95,11 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
101
95
  @parent_data[:model_class] = model_name.to_s.classify.constantize
102
96
  @parent_data[:find_by] = options[:find_by] || :id
103
97
  end
98
+ end
104
99
 
105
- def new_action
106
- @callbacks ||= {}
107
- @callbacks[:new_action] ||= Spree::ActionCallbacks.new
108
- end
109
-
110
- def create
111
- @callbacks ||= {}
112
- @callbacks[:create] ||= Spree::ActionCallbacks.new
113
- end
114
-
115
- def update
116
- @callbacks ||= {}
117
- @callbacks[:update] ||= Spree::ActionCallbacks.new
118
- end
119
-
120
- def destroy
121
- @callbacks ||= {}
122
- @callbacks[:destroy] ||= Spree::ActionCallbacks.new
123
- end
100
+ def resource_not_found
101
+ flash[:error] = flash_message_for(model_class.new, :not_found)
102
+ redirect_to collection_url
124
103
  end
125
104
 
126
105
  def model_class
@@ -209,16 +188,6 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
209
188
  collection_url
210
189
  end
211
190
 
212
- def invoke_callbacks(action, callback_type)
213
- callbacks = self.class.callbacks || {}
214
- return if callbacks[action].nil?
215
- case callback_type.to_sym
216
- when :before then callbacks[action].before_methods.each {|method| send method }
217
- when :after then callbacks[action].after_methods.each {|method| send method }
218
- when :fails then callbacks[action].fails_methods.each {|method| send method }
219
- end
220
- end
221
-
222
191
  # URL helpers
223
192
 
224
193
  def new_object_url(options = {})
@@ -6,7 +6,7 @@ module Spree
6
6
  before_filter :set_zones, :only => [:create, :update]
7
7
 
8
8
  def destroy
9
- @object.touch :deleted_at
9
+ @object.destroy
10
10
 
11
11
  flash[:success] = flash_message_for(@object, :successfully_removed)
12
12
 
@@ -2,15 +2,21 @@ module Spree
2
2
  module Admin
3
3
  class StockLocationsController < ResourceController
4
4
 
5
- new_action.before :set_country
5
+ before_filter :set_country, :only => :new
6
6
 
7
7
  private
8
8
 
9
9
  def set_country
10
- if Spree::Config[:default_country_id].present?
11
- @stock_location.country = Spree::Country.find(Spree::Config[:default_country_id])
12
- else
13
- @stock_location.country = Spree::Country.find_by_iso('US')
10
+ begin
11
+ if Spree::Config[:default_country_id].present?
12
+ @stock_location.country = Spree::Country.find(Spree::Config[:default_country_id])
13
+ else
14
+ @stock_location.country = Spree::Country.find_by!(iso: 'US')
15
+ end
16
+
17
+ rescue ActiveRecord::RecordNotFound
18
+ flash[:error] = Spree.t(:stock_locations_need_a_default_country)
19
+ redirect_to admin_stock_locations_path and return
14
20
  end
15
21
  end
16
22
 
@@ -0,0 +1,159 @@
1
+ module Spree
2
+ module Admin
3
+ class UsersController < ResourceController
4
+ rescue_from Spree::Core::DestroyWithOrdersError, :with => :user_destroy_with_orders_error
5
+
6
+ after_filter :sign_in_if_change_own_password, :only => :update
7
+
8
+ # http://spreecommerce.com/blog/2010/11/02/json-hijacking-vulnerability/
9
+ before_filter :check_json_authenticity, :only => :index
10
+ before_filter :load_roles
11
+
12
+ def index
13
+ respond_with(@collection) do |format|
14
+ format.html
15
+ format.json { render :json => json_data }
16
+ end
17
+ end
18
+
19
+ def show
20
+ redirect_to edit_admin_user_path(@user)
21
+ end
22
+
23
+ def create
24
+ if params[:user]
25
+ roles = params[:user].delete("spree_role_ids")
26
+ end
27
+
28
+ @user = Spree.user_class.new(user_params)
29
+ if @user.save
30
+
31
+ if roles
32
+ @user.spree_roles = roles.reject(&:blank?).collect{|r| Spree::Role.find(r)}
33
+ end
34
+
35
+ flash.now[:success] = Spree.t(:created_successfully)
36
+ render :edit
37
+ else
38
+ render :new
39
+ end
40
+ end
41
+
42
+ def update
43
+ if params[:user]
44
+ roles = params[:user].delete("spree_role_ids")
45
+ end
46
+
47
+ if @user.update_attributes(user_params)
48
+ if roles
49
+ @user.spree_roles = roles.reject(&:blank?).collect{|r| Spree::Role.find(r)}
50
+ end
51
+ flash.now[:success] = Spree.t(:account_updated)
52
+ end
53
+
54
+ render :edit
55
+ end
56
+
57
+ def addresses
58
+ if request.put?
59
+ if @user.update_attributes(user_params)
60
+ flash.now[:success] = Spree.t(:account_updated)
61
+ end
62
+
63
+ render :addresses
64
+ end
65
+ end
66
+
67
+ def orders
68
+ params[:q] ||= {}
69
+ @search = Spree::Order.ransack(params[:q].merge(user_id_eq: @user.id))
70
+ @orders = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
71
+ end
72
+
73
+ def items
74
+ params[:q] ||= {}
75
+ @search = Spree::Order.includes(
76
+ line_items: {
77
+ variant: [:product, { option_values: :option_type }]
78
+ }).ransack(params[:q].merge(user_id_eq: @user.id))
79
+ @orders = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
80
+ end
81
+
82
+ def generate_api_key
83
+ if @user.generate_spree_api_key!
84
+ flash[:success] = Spree.t('api.key_generated')
85
+ end
86
+ redirect_to edit_admin_user_path(@user)
87
+ end
88
+
89
+ def clear_api_key
90
+ if @user.clear_spree_api_key!
91
+ flash[:success] = Spree.t('api.key_cleared')
92
+ end
93
+ redirect_to edit_admin_user_path(@user)
94
+ end
95
+
96
+ def model_class
97
+ Spree.user_class
98
+ end
99
+
100
+ protected
101
+
102
+ def collection
103
+ return @collection if @collection.present?
104
+ if request.xhr? && params[:q].present?
105
+ @collection = Spree.user_class.includes(:bill_address, :ship_address)
106
+ .where("spree_users.email #{LIKE} :search
107
+ OR (spree_addresses.firstname #{LIKE} :search AND spree_addresses.id = spree_users.bill_address_id)
108
+ OR (spree_addresses.lastname #{LIKE} :search AND spree_addresses.id = spree_users.bill_address_id)
109
+ OR (spree_addresses.firstname #{LIKE} :search AND spree_addresses.id = spree_users.ship_address_id)
110
+ OR (spree_addresses.lastname #{LIKE} :search AND spree_addresses.id = spree_users.ship_address_id)",
111
+ { :search => "#{params[:q].strip}%" })
112
+ .limit(params[:limit] || 100)
113
+ else
114
+ @search = Spree.user_class.ransack(params[:q])
115
+ @collection = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
116
+ end
117
+ end
118
+
119
+ private
120
+ def user_params
121
+ params.require(:user).permit(PermittedAttributes.user_attributes |
122
+ [:spree_role_ids,
123
+ ship_address_attributes: PermittedAttributes.address_attributes,
124
+ bill_address_attributes: PermittedAttributes.address_attributes])
125
+ end
126
+
127
+ # handling raise from Spree::Admin::ResourceController#destroy
128
+ def user_destroy_with_orders_error
129
+ invoke_callbacks(:destroy, :fails)
130
+ render :status => :forbidden, :text => Spree.t(:error_user_destroy_with_orders)
131
+ end
132
+
133
+ # Allow different formats of json data to suit different ajax calls
134
+ def json_data
135
+ json_format = params[:json_format] or 'default'
136
+ case json_format
137
+ when 'basic'
138
+ collection.map { |u| { 'id' => u.id, 'name' => u.email } }.to_json
139
+ else
140
+ address_fields = [:firstname, :lastname, :address1, :address2, :city, :zipcode, :phone, :state_name, :state_id, :country_id]
141
+ includes = { :only => address_fields , :include => { :state => { :only => :name }, :country => { :only => :name } } }
142
+
143
+ collection.to_json(:only => [:id, :email], :include =>
144
+ { :bill_address => includes, :ship_address => includes })
145
+ end
146
+ end
147
+
148
+ def sign_in_if_change_own_password
149
+ if try_spree_current_user == @user && @user.password.present?
150
+ sign_in(@user, :event => :authentication, :bypass => true)
151
+ end
152
+ end
153
+
154
+ def load_roles
155
+ @roles = Spree::Role.all
156
+ end
157
+ end
158
+ end
159
+ end
@@ -12,7 +12,7 @@
12
12
  </strong></td>
13
13
  <td class="align-center">
14
14
  <span class="<%= @order.payments.failed.count > 0 ? 'state void' : 'state complete' %>">
15
- <%= link_to "#{pluralize(@order.payments.failed.count, Spree.t(:payment))}", spree.admin_order_payments_path(@order) %>
15
+ <%= link_to "#{Spree.t 'payments_count', count: @order.payments.failed.count, default: pluralize(@order.payments.failed.count, Spree.t(:payment))}", spree.admin_order_payments_path(@order) %>
16
16
  </span>
17
17
  </td>
18
18
  </tr>
@@ -41,7 +41,7 @@
41
41
  <div class="field alpha five columns">
42
42
  <%= label_tag 'selected_shipping_rate_id', Spree.t(:shipping_method) %>
43
43
  <%= select_tag :selected_shipping_rate_id,
44
- options_for_select(shipment.shipping_rates.with_shipping_method.map {|sr| ["#{sr.name} #{sr.display_price}", sr.id] }, shipment.selected_shipping_rate_id),
44
+ options_for_select(shipment.shipping_rates.map {|sr| ["#{sr.name} #{sr.display_price}", sr.id] }, shipment.selected_shipping_rate_id),
45
45
  {:class => 'select2 fullwidth', :data => {'shipment-number' => shipment.number } } %>
46
46
  </div>
47
47
  </td>
@@ -10,19 +10,25 @@
10
10
  <label><%= Spree.t(:payment_method) %></label>
11
11
  <ul>
12
12
  <% @payment_methods.each do |method| %>
13
- <li>
13
+ <li data-id="<%= Spree.t(method.name, :scope => :payment_methods, :default => method.name).parameterize %>">
14
14
  <label data-hook="payment_method_field">
15
- <%= radio_button_tag 'payment[payment_method_id]', method.id, method == @payment_method %>
15
+ <%= radio_button_tag 'payment[payment_method_id]', method.id, method == @payment_method, { class: "payment_methods_radios" } %>
16
16
  <%= Spree.t(method.name, :scope => :payment_methods, :default => method.name) %>
17
17
  </label>
18
18
  </li>
19
19
  <% end %>
20
20
  </ul>
21
+
21
22
  <div class="payment-method-settings">
22
23
  <% @payment_methods.each do |method| %>
23
- <% if method.source_required? %>
24
- <%= render :partial => "spree/admin/payments/source_forms/#{method.method_type}", :locals => { :payment_method => method } %>
25
- <% end %>
24
+
25
+ <div class="payment-methods" id="payment_method_<%= method.id %>">
26
+ <% if method.source_required? %>
27
+ <br />
28
+ <%= render :partial => "spree/admin/payments/source_forms/#{method.method_type}",
29
+ :locals => { :payment_method => method, previous_cards: method.sources_with_profile(@order) } %>
30
+ <% end %>
31
+ </div>
26
32
  <% end %>
27
33
  </div>
28
34
  </div>