caboose-cms 0.5.64 → 0.5.66

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 (63) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/caboose/admin.js +1 -1
  3. data/app/assets/javascripts/caboose/admin_edit_order.js +724 -0
  4. data/app/assets/javascripts/caboose/cart2.js +4 -4
  5. data/app/assets/javascripts/caboose/model/index_table.js +122 -80
  6. data/app/assets/stylesheets/caboose/admin_main.css +8 -0
  7. data/app/controllers/caboose/application_controller.rb +1 -1
  8. data/app/controllers/caboose/block_type_sources_controller.rb +1 -1
  9. data/app/controllers/caboose/block_types_controller.rb +1 -1
  10. data/app/controllers/caboose/calendars_controller.rb +1 -1
  11. data/app/controllers/caboose/cart_controller.rb +8 -1
  12. data/app/controllers/caboose/checkout_controller.rb +17 -9
  13. data/app/controllers/caboose/line_items_controller.rb +135 -0
  14. data/app/controllers/caboose/order_packages_controller.rb +304 -0
  15. data/app/controllers/caboose/orders_controller.rb +31 -74
  16. data/app/controllers/caboose/pages_controller.rb +2 -1
  17. data/app/controllers/caboose/product_images_controller.rb +11 -0
  18. data/app/controllers/caboose/products_controller.rb +25 -8
  19. data/app/controllers/caboose/shipping_addresses_controller.rb +46 -0
  20. data/app/controllers/caboose/shipping_packages_controller.rb +125 -54
  21. data/app/controllers/caboose/sites_controller.rb +2 -79
  22. data/app/controllers/caboose/smtp_controller.rb +52 -0
  23. data/app/controllers/caboose/store_controller.rb +94 -0
  24. data/app/controllers/caboose/vendors_controller.rb +25 -4
  25. data/app/models/caboose/address.rb +1 -3
  26. data/app/models/caboose/caboose_plugin.rb +1 -1
  27. data/app/models/caboose/category.rb +18 -0
  28. data/app/models/caboose/core_plugin.rb +21 -19
  29. data/app/models/caboose/order.rb +12 -7
  30. data/app/models/caboose/order_package.rb +5 -2
  31. data/app/models/caboose/order_transaction.rb +25 -0
  32. data/app/models/caboose/page.rb +1 -1
  33. data/app/models/caboose/schema.rb +50 -22
  34. data/app/models/caboose/shipping_calculator.rb +26 -30
  35. data/app/models/caboose/shipping_package.rb +45 -5
  36. data/app/models/caboose/store_config.rb +18 -6
  37. data/app/models/caboose/tax_calculator.rb +6 -5
  38. data/app/views/caboose/blocks/admin_edit.html.erb +1 -1
  39. data/app/views/caboose/line_items/admin_new.html.erb +100 -0
  40. data/app/views/caboose/orders/admin_edit.html.erb +21 -247
  41. data/app/views/caboose/orders/admin_edit_old.html.erb +155 -0
  42. data/app/views/caboose/orders/admin_new.html.erb +8 -23
  43. data/app/views/caboose/products/#Untitled-1# +0 -0
  44. data/app/views/caboose/products/admin_edit_images.html.erb +20 -4
  45. data/app/views/caboose/products/admin_index.html.erb +9 -3
  46. data/app/views/caboose/products/admin_sort.html.erb +138 -142
  47. data/app/views/caboose/roles/index.html.erb +1 -1
  48. data/app/views/caboose/shipping_packages/admin_edit.html.erb +52 -137
  49. data/app/views/caboose/shipping_packages/admin_index.html.erb +56 -19
  50. data/app/views/caboose/sites/_admin_header.html.erb +3 -5
  51. data/app/views/caboose/sites/admin_edit.html.erb +5 -3
  52. data/app/views/caboose/smtp/admin_edit.html.erb +41 -0
  53. data/app/views/caboose/station/index.html.erb +1 -1
  54. data/app/views/caboose/store/admin_edit.html.erb +96 -0
  55. data/app/views/caboose/vendors/admin_edit.html.erb +7 -3
  56. data/app/views/layouts/caboose/_station.html.erb +1 -1
  57. data/config/routes.rb +67 -25
  58. data/lib/caboose/engine.rb +1 -1
  59. data/lib/caboose/version.rb +1 -1
  60. metadata +28 -5
  61. data/app/views/caboose/shipping_packages/admin_new.html.erb +0 -33
  62. data/app/views/caboose/sites/admin_edit_smtp_config.html.erb +0 -51
  63. data/app/views/caboose/sites/admin_edit_store_config.html.erb +0 -77
@@ -11,48 +11,44 @@ module Caboose
11
11
  def self.rates(order)
12
12
  return [] if Caboose::store_shipping.nil?
13
13
 
14
- store_config = order.site.store_config
15
- if store_config
16
- rates = self.custom_rates(store_config, order)
14
+ sc = order.site.store_config
15
+ if sc.shipping_rates_function
16
+ rates = self.custom_rates(sc, order)
17
17
  return rates
18
18
  end
19
-
20
- ss = Caboose::store_shipping
19
+
21
20
  origin = Location.new(
22
- :country => ss[:origin][:country],
23
- :state => ss[:origin][:state],
24
- :city => ss[:origin][:city],
25
- :zip => ss[:origin][:zip]
21
+ :country => sc.origin_country,
22
+ :state => sc.origin_state,
23
+ :city => sc.origin_city,
24
+ :zip => sc.origin_zip
26
25
  )
27
26
  destination = Location.new(
28
- :country => ss[:origin][:country],
27
+ :country => sc.origin_country,
29
28
  :state => order.shipping_address.state,
30
29
  :city => order.shipping_address.city,
31
30
  :postal_code => order.shipping_address.zip
32
- )
33
- ups = ss[:ups] ? UPS.new(:key => ss[:ups][:key], :login => ss[:ups][:username], :password => ss[:ups][:password], :origin_account => ss[:ups][:origin_account]) : nil
34
- usps = ss[:usps] ? USPS.new(:login => ss[:usps][:username]) : nil
35
-
31
+ )
32
+ carriers = {}
33
+ carriers['UPS'] = UPS.new( :login => sc.ups_username, :password => sc.ups_password, :key => sc.ups_key, :origin_account => sc.ups_origin_account) if sc.ups_username.strip.length > 0
34
+ carriers['USPS'] = USPS.new( :login => sc.usps_username) if sc.usps_username.strip.length > 0
35
+ carriers['FedEx'] = FedEx.new(:login => sc.fedex_username, :password => sc.fedex_password, :key => sc.fedex_key, :account => sc.fedex_account) if sc.fedex_username.strip.length > 0
36
+
36
37
  all_rates = []
37
- order.packages.each do |op|
38
- sp = op.shipping_package
38
+ order.packages.each do |op|
39
+ sp = op.shipping_package
39
40
  package = op.activemerchant_package
40
41
  rates = []
41
- if ups
42
- resp = ups.find_rates(origin, destination, package)
43
- resp.rates.sort_by(&:price).each do |rate|
44
- next if rate.service_code != sp.service_code
45
- rates << { :carrier => 'UPS', :service_code => rate.service_code, :service_name => rate.service_name, :price => rate.total_price.to_d / 100 }
46
- end
47
- end
48
- if usps
49
- resp = usps.find_rates(origin, destination, package)
50
- resp.rates.sort_by(&:price).each do |rate|
51
- next if rate.service_code != sp.service_code
52
- rates << { :carrier => 'USPS', :service_code => rate.service_code, :service_name => rate.service_name, :total_price => rate.total_price.to_d / 100 }
42
+ carriers.each do |name, carrier|
43
+ if sp.uses_carrier(name)
44
+ resp = carrier.find_rates(origin, destination, package)
45
+ resp.rates.sort_by(&:price).each do |rate|
46
+ next if !sp.uses_service_code(name, rate.service_code)
47
+ rates << { :carrier => name, :service_code => rate.service_code, :service_name => rate.service_name, :price => rate.total_price.to_d / 100 }
48
+ end
53
49
  end
54
- end
55
- all_rates << { :order_package => op, :rates => rates }
50
+ end
51
+ all_rates << { :order_package => op, :rates => rates }
56
52
  end
57
53
  return all_rates
58
54
  end
@@ -9,12 +9,17 @@ module Caboose
9
9
  attr_accessible :id,
10
10
  :site_id,
11
11
  :name,
12
- :length,
13
- :width,
14
- :height,
12
+ :inside_length,
13
+ :inside_width,
14
+ :inside_height,
15
+ :outside_length,
16
+ :outside_width,
17
+ :outside_height,
15
18
  :volume,
19
+ :empty_weight,
20
+ :cylinder,
16
21
  :priority,
17
- :flat_rate_price
22
+ :flat_rate_price
18
23
 
19
24
  def fits(variants)
20
25
 
@@ -36,7 +41,7 @@ module Caboose
36
41
  rigid_boxes = self.boxes(rigid)
37
42
 
38
43
  it_fits = false
39
- BoxPacker.container [self.length, self.width, self.height] do
44
+ BoxPacker.container [self.inside_length, self.inside_width, self.inside_height] do
40
45
  rigid_boxes.each{ |arr| add_item arr }
41
46
  count = pack!
42
47
  it_fits = true if count == rigid_boxes.count
@@ -86,6 +91,41 @@ module Caboose
86
91
 
87
92
  return nonstackable
88
93
  end
94
+
95
+ def toggle_shipping_method(shipping_method_id, value)
96
+ if value.to_i > 0 # Add
97
+ if shipping_method_id == 'all'
98
+ ShippingPackageMethod.where(:shipping_package_id => self.id).destroy_all
99
+ ShippingMethod.reorder(:service_name).all.each do |sm|
100
+ ShippingPackageMethod.create(:shipping_package_id => self.id, :shipping_method_id => sm.id)
101
+ end
102
+ else
103
+ if !ShippingPackageMethod.where(:shipping_package_id => self.id, :shipping_method_id => shipping_method_id.to_i).exists?
104
+ ShippingPackageMethod.create(:shipping_package_id => self.id, :shipping_method_id => shipping_method_id.to_i)
105
+ end
106
+ end
107
+ else # Remove
108
+ if shipping_method_id == 'all'
109
+ ShippingPackageMethod.where(:shipping_package_id => self.id).destroy_all
110
+ else
111
+ ShippingPackageMethod.where(:shipping_package_id => self.id, :shipping_method_id => shipping_method_id.to_i).destroy_all
112
+ end
113
+ end
114
+ end
115
+
116
+ def uses_carrier(carrier)
117
+ self.shipping_methods.each do |sm|
118
+ return true if sm.carrier == carrier
119
+ end
120
+ return false
121
+ end
122
+
123
+ def uses_service_code(carrier, service_code)
124
+ self.shipping_methods.each do |sm|
125
+ return true if sm.carrier == carrier && sm.service_code == service_code
126
+ end
127
+ return false
128
+ end
89
129
 
90
130
  end
91
131
  end
@@ -1,23 +1,35 @@
1
1
  module Caboose
2
2
  class StoreConfig < ActiveRecord::Base
3
- self.table_name = 'store_configs'
3
+ self.table_name = 'store_configs'
4
+
4
5
  belongs_to :site
5
6
  attr_accessible :id,
6
7
  :site_id,
7
8
  :pp_name,
8
9
  :pp_username,
9
- :pp_password,
10
- :use_usps,
10
+ :pp_password,
11
+ :ups_username,
12
+ :ups_password,
13
+ :ups_key,
14
+ :ups_origin_account,
15
+ :usps_username,
11
16
  :usps_secret_key,
12
17
  :usps_publishable_key,
13
- :allowed_shipping_codes, # ['0','7','6','1','2','3'],
14
- :default_shipping_code,
18
+ :fedex_username,
19
+ :fedex_password,
20
+ :fedex_key,
21
+ :fedex_account,
15
22
  :origin_country,
16
23
  :origin_state,
17
24
  :origin_city,
18
25
  :origin_zip,
19
26
  :fulfillment_email,
20
27
  :shipping_email,
21
- :handling_percentage
28
+ :handling_percentage,
29
+ :calculate_packages,
30
+ :shipping_rates_function,
31
+ :length_unit,
32
+ :weight_unit
33
+
22
34
  end
23
35
  end
@@ -1,9 +1,10 @@
1
1
  module Caboose
2
2
  class TaxCalculator
3
3
  def self.tax_rate(address)
4
- return 0 if address.state.downcase != 'al'
5
- city = address.city.downcase
6
- rate = 0.00
4
+ return 0.00 if address.nil? || address.city.nil? || address.state.nil?
5
+ return 0 if address.state.downcase != 'al'
6
+ rate = 0.00
7
+ city = address.city.downcase
7
8
  rate = rate + 0.05 if city == 'brookwood'
8
9
  rate = rate + 0.05 if city == 'coaling'
9
10
  rate = rate + 0.05 if city == 'coker'
@@ -14,8 +15,8 @@ module Caboose
14
15
  rate = rate + 0.05 if city == 'northport'
15
16
  rate = rate + 0.05 if city == 'tuscaloosa'
16
17
  rate = rate + 0.05 if city == 'vance'
17
- rate = rate + 0.05 if city == 'woodstock'
18
- rate = rate + 0.04 if address.state.downcase == 'al' || address.state.downcase == 'alabama'
18
+ rate = rate + 0.05 if city == 'woodstock'
19
+ rate = rate + 0.04 if address.state.downcase == 'al' || address.state.downcase == 'alabama'
19
20
  return rate.round(2)
20
21
  end
21
22
  end
@@ -44,7 +44,7 @@ end
44
44
  <p><div id='block_<%= @block.id %>_value'></div></p>
45
45
  <% else %>
46
46
  <% if @block.children.count > 0 %>
47
- <% @block.children.each do |b| %>
47
+ <% @block.children.order(:id).each do |b| %>
48
48
  <% if b.block_type.field_type != 'block' && b.block_type.field_type != 'richtext' %>
49
49
  <div style='margin-bottom: 10px;'><div id='block_<%= b.id %>_value'></div></div>
50
50
  <% else %>
@@ -0,0 +1,100 @@
1
+
2
+ <h1>Add Item</h1>
3
+
4
+ <p><input type='text' name='product_title' id='product_title' value='' style='width: 400px;' /></p>
5
+ <div id='products'></div>
6
+ <div id='variants'></div>
7
+ <div id='message'></div>
8
+
9
+ <p><input type='button' value='Cancel' onclick="modal.close();" /></p>
10
+
11
+ <% content_for :caboose_js do %>
12
+ <%= javascript_include_tag 'caboose/model/all' %>
13
+ <script type='text/javascript'>
14
+
15
+ var modal = false;
16
+ $(window).load(function() {
17
+ modal = new CabooseModal(600);
18
+ });
19
+
20
+ $(document).ready(function() {
21
+ $('#product_title').on('keyup', function() { show_products(); });
22
+ });
23
+
24
+ function show_products()
25
+ {
26
+ var title = $('#product_title').val();
27
+ $.ajax({
28
+ url: '/admin/orders/line-items/product-stubs',
29
+ type: 'get',
30
+ data: { title: title },
31
+ success: function(products) {
32
+ if (products && products.length > 0)
33
+ {
34
+ var ul = $('<ul/>');
35
+ $.each(products, function(i, p) {
36
+ ul.append($('<li/>')
37
+ .attr('id', 'product_id_' + p.id)
38
+ .data('product_id', p.id)
39
+ .append($('<a/>').html(p.title).click(function(e) {
40
+ e.preventDefault();
41
+ show_variants($(e.target).parent(), $(e.target).parent().data('product_id'));
42
+ }))
43
+ );
44
+ });
45
+ $('#products').empty().append(ul);
46
+ }
47
+ else
48
+ {
49
+ $('#products').empty().append($('<p/>').html('No products met your search.'));
50
+ }
51
+ modal.autosize();
52
+ }
53
+ });
54
+ }
55
+
56
+ var open_product_id = false;
57
+
58
+ function show_variants(li, product_id)
59
+ {
60
+ if (open_product_id && open_product_id == product_id)
61
+ {
62
+ $('#product_id_' + open_product_id).find('ul').remove();
63
+ open_product_id = false;
64
+ return;
65
+ }
66
+ if (open_product_id)
67
+ {
68
+ $('#product_id_' + open_product_id).find('ul').remove();
69
+ open_product_id = false;
70
+ }
71
+ open_product_id = product_id;
72
+ $.ajax({
73
+ url: '/admin/products/' + product_id + '/variants/json',
74
+ type: 'get',
75
+ success: function(resp) {
76
+ var ul = $('<ul/>');
77
+ $.each(resp.models, function(i, v) {
78
+ var name = [];
79
+ if (v.option1) name.push(v.option1);
80
+ if (v.option2) name.push(v.option2);
81
+ if (v.option3) name.push(v.option3);
82
+ name = name.join(' / ');
83
+ ul.append($('<li/>')
84
+ .data('variant_id', v.id)
85
+ .append($('<a/>').html(name).click(function(e) {
86
+ e.preventDefault();
87
+ variant_id = $(e.target).parent().data('variant_id');
88
+ parent.controller.add_variant(variant_id);
89
+ modal.close();
90
+ }))
91
+ );
92
+ });
93
+ li.append(ul);
94
+ modal.autosize();
95
+ }
96
+ });
97
+ }
98
+
99
+ </script>
100
+ <% end %>
@@ -1,106 +1,10 @@
1
- <%
2
- sa = @order.shipping_address
3
- shipping_address = sa.address1
4
- shipping_address << "<br />#{sa.address2}" if sa.address2 && sa.address2.length > 0
5
- shipping_address << "<br />#{sa.city}, #{sa.state} #{sa.zip}"
6
- captured = @order.financial_status == 'captured'
7
- %>
1
+
8
2
  <input type='hidden' name='order_id' id='order_id' value='<%= @order.id %>' />
9
3
 
10
4
  <h1>Edit Order #<%= @order.id %></h1>
11
-
12
- <table class='data'>
13
- <tr>
14
- <th><%= if @order.customer.nil? then 'Guest' else 'Customer' end %></th>
15
- <th>Shipping Address</th>
16
- <th>Shipping Method</th>
17
- <th>Order Status</th>
18
- <th>Payment Status</th>
19
- <th>Transaction ID</th>
20
- </tr>
21
- <tr>
22
- <td valign='top'>
23
- <%= "#{@order.shipping_address.first_name} #{@order.shipping_address.last_name}" %><br />
24
- <% if @order.customer %>
25
- <a href="mailto:<%= "#{@order.customer.email}" %>"><%= "#{@order.customer.email}" %></a><br />
26
- <% elsif @order.email %>
27
- <a href="mailto:<%= @order.email %>"><%= @order.email %></a>
28
- <% end %>
29
- <%= @order.customer ? @order.customer.phone : @order.shipping_address.phone %>
30
- </td>
31
- <td valign='top'>
32
- <%= "#{@order.shipping_address.first_name} #{@order.shipping_address.last_name}" %><br />
33
- <%= raw shipping_address %>
34
- </td>
35
- <td valign='top' align='center'>
36
- <% if @order.shipping_service_code %>
37
- <%= @order.shipping_carrier %> <%= @order.shipping_service_name %>
38
- <% else %>
39
- Multiple packages
40
- <% end %>
41
- </td>
42
- <td valign='top'>
43
- <div id='order_<%= @order.id %>_status'></div>
44
- </td>
45
- <td valign='top' align='center'>
46
- <%= @order.financial_status %>
47
- <% if @order.financial_status == 'authorized' %>
48
- for<br /><%= number_to_currency(@order.auth_amount) %>
49
- <% end %>
50
- </td>
51
- <td valign="top" align='center'><%= @order.transaction_id %></td>
52
- </tr>
53
- </table><br />
54
-
55
- <table class='data' width='100%'>
56
- <tr>
57
- <th>Item</th>
58
- <th>Status</th>
59
- <th>Tracking Number</th>
60
- <th>Unit Price</th>
61
- <th>Quantity</th>
62
- <th>Subtotal</th>
63
- </tr>
64
- <% @order.line_items.each do |li| %>
65
- <tr>
66
- <td>
67
- <% if li.variant.nil? || li.variant.product.nil? %>
68
- <% if li.variant.nil? %>
69
- Unknown variant
70
- <% else %>
71
- <%= li.variant.sku %>
72
- <% end %>
73
- <% else %>
74
- <a href='/admin/products/<%= li.variant.product.id %>/variants?highlight=<%= li.variant.id %>'><%= li.variant.product.title %></a><br />
75
- <%= li.variant.sku %><br />
76
- <%= li.variant.title %>
77
- <% end %>
78
- </td>
79
- <td ><div id='lineitem_<%= li.id %>_status' ></div></td>
80
- <td ><div id='lineitem_<%= li.id %>_tracking_number' ></div></td>
81
- <td align='right'><%= number_to_currency(li.variant.price) %></td>
82
- <td align='right'><% if captured %><%= li.quantity %><% else %><div id='lineitem_<%= li.id %>_quantity'></div><% end %></td>
83
- <td align='right' id='li_<%= li.id %>_subtotal'><%= number_to_currency(li.price) %></td>
84
- </tr>
85
- <% end %>
86
- <tr><td colspan='5' align='right'>Subtotal </td><td align='right' id='subtotal' ><%= number_to_currency(@order.subtotal ) %></td></tr>
87
- <tr><td colspan='5' align='right'>Tax </td><td align='right' id='tax' ><%= number_to_currency(@order.tax ) %></td></tr>
88
- <tr><td colspan='5' align='right'><%= @order.shipping_service_code ? @order.shipping_service_code : '' %> Shipping &amp; Handling </td><td align='right' id='shipping'><%= number_to_currency(@order.shipping + @order.handling) %></td></tr>
89
- <tr>
90
- <td colspan='5' align='right'>Discount</td>
91
- <td align='right'>
92
- <% if captured && @order.discounts.any? %>
93
- <%= number_to_currency(@order.amount_discounted || 0) %>
94
- <% elsif @order.discounts.any? %>
95
- <%= number_to_currency(@order.discounts.first.amount_current) %>
96
- <% else %>
97
- $0.00
98
- <% end %>
99
- </td>
100
- </tr>
101
5
 
102
- <tr><td colspan='5' align='right'>Total </td><td align='right' id='total' ><%= number_to_currency(@order.total ) %></td></tr>
103
- </table>
6
+ <div id='overview_table'></div>
7
+ <div id='order_table'></div>
104
8
  <div id='message'></div>
105
9
 
106
10
  <p>
@@ -113,6 +17,7 @@ captured = @order.financial_status == 'captured'
113
17
  <input type='button' value='Refund' onclick="refund_order(<%= @order.id %>);" />
114
18
  <% end %>
115
19
  <input type='button' value='Resend Confirmation' onclick="resend_confirmation(<%= @order.id %>)" />
20
+ <input type='button' value='Add Item' onclick="controller.add_variant();" />
116
21
  <input type='button' value='Print Order' onclick="print_order(<%= @order.id %>);" />
117
22
 
118
23
  <% str = Caboose.plugin_hook('admin_edit_order_buttons', "", @order) %>
@@ -121,159 +26,28 @@ captured = @order.financial_status == 'captured'
121
26
 
122
27
  <% content_for :caboose_js do %>
123
28
  <%= javascript_include_tag 'caboose/model/all' %>
29
+ <%= javascript_include_tag 'caboose/admin_edit_order' %>
124
30
  <script type='text/javascript'>
125
31
 
126
- function resend_confirmation(order_id)
127
- {
128
- modal.autosize("<p class='loading'>Resending confirmation..</p>");
129
- $.ajax({
130
- type: 'post',
131
- url: '/admin/orders/' + order_id + '/resend-confirmation',
132
- success: function(resp) {
133
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
134
- if (resp.success) modal.autosize("<p class='note success'>" + resp.success + "</p>");
135
- }
136
- });
137
- }
138
-
139
- function capture_funds(order_id, confirm)
140
- {
141
- total = $('#total').html();
142
- if (!confirm)
143
- {
144
- var p = $('<p/>').addClass('note confirm')
145
- .append("Are you sure you want to charge " + total + " to the customer? ")
146
- .append($('<input/>').attr('type','button').val('Yes').click(function() { capture_funds(order_id, true); }))
147
- .append(' ')
148
- .append($('<input/>').attr('type','button').val('No').click(function() { $('#message').empty(); modal.autosize(); }));
149
- modal.autosize(p);
150
- return;
151
- }
152
- modal.autosize("<p class='loading'>Capturing funds...</p>");
153
- $.ajax({
154
- url: '/admin/orders/' + order_id + '/capture',
155
- success: function(resp) {
156
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
157
- if (resp.success) modal.autosize("<p class='note success'>" + resp.success + "</p>");
158
- if (resp.refresh) window.location.reload(true);
159
- }
160
- });
161
- }
162
-
163
- function void_order(order_id, confirm)
164
- {
165
- if (!confirm)
166
- {
167
- var p = $('<p/>').addClass('note confirm')
168
- .append("Are you sure you want to void this order? ")
169
- .append($('<input/>').attr('type','button').val('Yes').click(function() { void_order(order_id, true); }))
170
- .append(' ')
171
- .append($('<input/>').attr('type','button').val('No').click(function() { $('#message').empty(); modal.autosize(); }));
172
- modal.autosize(p);
173
- return;
174
- }
175
- modal.autosize("<p class='loading'>Voiding...</p>");
176
- $.ajax({
177
- url: '/admin/orders/' + order_id + '/void',
178
- success: function(resp) {
179
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
180
- if (resp.success) modal.autosize("<p class='note success'>" + resp.success + "</p>");
181
- if (resp.refresh) window.location.reload(true);
182
- }
183
- });
184
- }
185
-
186
- function refund_order(order_id, confirm)
187
- {
188
- if (!confirm)
189
- {
190
- var p = $('<p/>').addClass('note confirm')
191
- .append("Are you sure you want to refund this order? ")
192
- .append($('<input/>').attr('type','button').val('Yes').click(function() { refund_order(order_id, true); }))
193
- .append(' ')
194
- .append($('<input/>').attr('type','button').val('No').click(function() { $('#message').empty(); modal.autosize(); }));
195
- modal.autosize(p);
196
- return;
197
- }
198
- modal.autosize("<p class='loading'>Refunding...</p>");
199
- $.ajax({
200
- url: '/admin/orders/' + order_id + '/refund',
201
- success: function(resp) {
202
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
203
- if (resp.success) modal.autosize("<p class='note success'>" + resp.success + "</p>");
204
- if (resp.refresh) window.location.reload(true);
205
- }
206
- });
207
- }
208
-
209
- function print_order(order_id)
210
- {
211
- window.open('/admin/orders/' + order_id + '/print');
212
- }
213
-
32
+ var controller = false;
214
33
  $(document).ready(function() {
215
- <% @order.line_items.each do |li| %>
216
- new ModelBinder({
217
- name: 'Lineitem',
218
- id: <%= li.id %>,
219
- update_url: '/admin/orders/<%= @order.id %>/line-items/<%= li.id %>',
220
- authenticity_token: '<%= form_authenticity_token %>',
221
- attributes: [
222
- { name: 'status' , nice_name: 'Status' , type: 'select' , align: 'left' , value: <%= raw Caboose.json(li.status ) %>, text: <%= raw Caboose.json(li.status ) %>, width: 150, fixed_placeholder: false, options_url: '/admin/orders/line-item-status-options' },
223
- { name: 'tracking_number' , nice_name: 'Tracking Number' , type: 'text' , align: 'left' , value: <%= raw Caboose.json(li.tracking_number ) %>, width: 200, fixed_placeholder: false },
224
- { name: 'quantity' , nice_name: 'Quantity' , type: 'text' , align: 'right', value: <%= raw Caboose.json(li.quantity ) %>, width: 75, fixed_placeholder: false,
225
- before_update: function() {
226
- modal.autosize("<p class='loading'>Recalculating tax, shipping and handling...</p>");
227
- },
228
- after_update: function() {
229
- var order_id = $('#order_id').val();
230
- $.ajax({
231
- url: '/admin/orders/' + order_id + '/json',
232
- success: function(order) {
233
- $.each(order.order_line_items, function(i, li) {
234
- $('#li_' + li.id + '_subtotal').html('$' + parseFloat(li.variant.price * li.quantity).toFixed(2));
235
- });
236
- var sah = parseFloat(order.shipping) + parseFloat(order.handling);
237
- $('#subtotal' ).html('$' + parseFloat(order.subtotal ).toFixed(2));
238
- $('#subtotal' ).html('$' + parseFloat(order.subtotal ).toFixed(2));
239
- $('#tax' ).html('$' + parseFloat(order.tax ).toFixed(2));
240
- $('#shipping' ).html('$' + parseFloat(sah ).toFixed(2));
241
- $('#total' ).html('$' + parseFloat(order.total ).toFixed(2));
242
- $('#order_total').val(parseFloat(order.total).toFixed(2));
243
- $('#message').empty();
244
- modal.autosize();
245
- }
246
- });
247
- }
248
- }
249
- ]
250
- });
251
- <% end %>
252
-
253
- new ModelBinder({
254
- name: 'Order',
255
- id: <%= @order.id %>,
256
- update_url: '/admin/orders/<%= @order.id %>',
257
- authenticity_token: '<%= form_authenticity_token %>',
258
- attributes: [
259
- {
260
- name: 'status',
261
- nice_name: 'Status',
262
- type: 'select',
263
- value: <%= raw Caboose.json(@order.status) %>,
264
- text: <%= raw Caboose.json(@order.status) %>,
265
- width: 100,
266
- options_url: '/admin/orders/status-options',
267
- fixed_placeholder: false
268
- }
269
- ]
34
+ controller = new OrderController({
35
+ order_id: <%= raw Caboose.json(@order.id) %>,
36
+ authenticity_token: <%= raw Caboose.json(form_authenticity_token) %>
270
37
  });
271
38
  });
272
39
 
273
- var modal = false;
274
- $(window).load(function() {
275
- modal = new CabooseModal('95%');
276
- });
277
-
278
40
  </script>
279
41
  <% end %>
42
+
43
+ <% content_for :caboose_css do %>
44
+ <style type='text/css'>
45
+
46
+ table.shipping_address td {
47
+ padding: 0 !important;
48
+ margin: 0 !important;
49
+ border: 0 !important;
50
+ }
51
+
52
+ </style>
53
+ <% end %>