caboose-store 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/caboose/main.js +8 -0
  3. data/app/assets/javascripts/caboose_store/admin.js +0 -19
  4. data/app/assets/javascripts/caboose_store/admin_products.js +3 -4
  5. data/app/assets/javascripts/caboose_store/application.js +6 -5
  6. data/app/assets/javascripts/caboose_store/cart.js.bak +258 -0
  7. data/app/assets/javascripts/caboose_store/checkout.js +151 -0
  8. data/app/assets/javascripts/caboose_store/config.js +83 -0
  9. data/app/assets/javascripts/caboose_store/jquery-ui-multisortable.js +254 -0
  10. data/app/assets/javascripts/caboose_store/jquery-ui.js +3572 -0
  11. data/app/assets/javascripts/caboose_store/main.js +20 -0
  12. data/app/assets/javascripts/caboose_store/modules/cart.js +167 -0
  13. data/app/assets/javascripts/caboose_store/modules/checkout.js +313 -0
  14. data/app/assets/javascripts/caboose_store/modules/product.js +282 -0
  15. data/app/assets/stylesheets/caboose_store/admin.css +3 -3
  16. data/app/assets/stylesheets/caboose_store/application.css +2 -2
  17. data/app/assets/stylesheets/caboose_store/modal.css +1 -0
  18. data/app/assets/templates/caboose_store/cart/add_to_cart.jst.ejs +7 -0
  19. data/app/assets/templates/caboose_store/cart/line_items.jst.ejs +41 -0
  20. data/app/assets/templates/caboose_store/checkout/address.jst.ejs +53 -0
  21. data/app/assets/templates/caboose_store/checkout/forms/guest.jst.ejs +8 -0
  22. data/app/assets/templates/caboose_store/checkout/forms/register.jst.ejs +11 -0
  23. data/app/assets/templates/caboose_store/checkout/forms/signin.jst.ejs +7 -0
  24. data/app/assets/templates/caboose_store/checkout/line_items.jst.ejs +32 -0
  25. data/app/assets/templates/caboose_store/checkout/login.jst.ejs +21 -0
  26. data/app/assets/templates/caboose_store/checkout/payment.jst.ejs +5 -0
  27. data/app/assets/templates/caboose_store/checkout/shipping.jst.ejs +18 -0
  28. data/app/assets/templates/caboose_store/product/images.jst.ejs +8 -0
  29. data/app/assets/templates/caboose_store/product/options.jst.ejs +19 -0
  30. data/app/controllers/caboose_store/application_controller.rb +1 -11
  31. data/app/controllers/caboose_store/cart_controller.rb +36 -44
  32. data/app/controllers/caboose_store/cart_controller.rb.bak +169 -0
  33. data/app/controllers/caboose_store/categories_controller.rb +72 -92
  34. data/app/controllers/caboose_store/checkout_controller.rb +231 -151
  35. data/app/controllers/caboose_store/orders_controller.rb +235 -95
  36. data/app/controllers/caboose_store/product_images_controller.rb +1 -1
  37. data/app/controllers/caboose_store/products_controller.rb +275 -84
  38. data/app/controllers/caboose_store/reviews_controller.rb +1 -1
  39. data/app/controllers/caboose_store/variants_controller.rb +86 -20
  40. data/app/controllers/caboose_store/vendors_controller.rb +73 -0
  41. data/app/helpers/caboose_store/application_helper.rb +3 -41
  42. data/app/helpers/caboose_store/cart_helper.rb +0 -24
  43. data/app/helpers/caboose_store/categories_helper.rb +69 -25
  44. data/app/helpers/caboose_store/checkout_helper.rb +31 -0
  45. data/app/helpers/caboose_store/products_helper.rb +4 -80
  46. data/app/mailers/caboose_store/orders_mailer.rb +6 -13
  47. data/app/models/caboose_store/address.rb +5 -9
  48. data/app/models/caboose_store/caboose_store_plugin.rb +18 -7
  49. data/app/models/caboose_store/category.rb +66 -41
  50. data/app/models/caboose_store/category_membership.rb +1 -2
  51. data/app/models/caboose_store/customization_membership.rb +10 -0
  52. data/app/models/caboose_store/discount.rb +4 -2
  53. data/app/models/caboose_store/line_item.rb +77 -0
  54. data/app/models/caboose_store/message.rb +3 -5
  55. data/app/models/caboose_store/order.rb +153 -63
  56. data/app/models/caboose_store/order_discount.rb +1 -2
  57. data/app/models/caboose_store/order_pdf.rb +2 -4
  58. data/app/models/caboose_store/payment_processors/authorizenet.rb +20 -2
  59. data/app/models/caboose_store/payment_processors/base.rb +0 -2
  60. data/app/models/caboose_store/payment_processors/payscape.rb +91 -1
  61. data/app/models/caboose_store/product.rb +86 -30
  62. data/app/models/caboose_store/product_image.rb +50 -15
  63. data/app/models/caboose_store/product_image_variant.rb +3 -3
  64. data/app/models/caboose_store/review.rb +8 -8
  65. data/app/models/caboose_store/schema.rb +174 -119
  66. data/app/models/caboose_store/search_filter.rb +110 -115
  67. data/app/models/caboose_store/shipping_calculator.rb +51 -49
  68. data/app/models/caboose_store/tax_calculator.rb +2 -6
  69. data/app/models/caboose_store/tax_line.rb +1 -4
  70. data/app/models/caboose_store/variant.rb +77 -21
  71. data/app/models/caboose_store/vendor.rb +17 -2
  72. data/app/views/caboose_store/cart/index.html.erb +3 -18
  73. data/app/views/caboose_store/categories/admin_edit.html.erb +64 -67
  74. data/app/views/caboose_store/categories/admin_index.html.erb +7 -9
  75. data/app/views/caboose_store/categories/admin_new.html.erb +56 -39
  76. data/app/views/caboose_store/checkout/_address_form.html.erb +111 -0
  77. data/app/views/caboose_store/checkout/_billing_form.html.erb +47 -0
  78. data/app/views/caboose_store/checkout/_cart.html.erb +52 -0
  79. data/app/views/caboose_store/checkout/_order_discount.html.erb +40 -0
  80. data/app/views/caboose_store/checkout/_shipping_address.html.erb +10 -0
  81. data/app/views/caboose_store/checkout/_shipping_method.html.erb +2 -0
  82. data/app/views/caboose_store/checkout/_shipping_method_form.html.erb +21 -0
  83. data/app/views/caboose_store/checkout/billing.html.erb +4 -161
  84. data/app/views/caboose_store/checkout/discount.html.erb +5 -160
  85. data/app/views/caboose_store/checkout/empty.html.erb +2 -0
  86. data/app/views/caboose_store/checkout/error.html.erb +2 -0
  87. data/app/views/caboose_store/checkout/index.html.erb +30 -100
  88. data/app/views/caboose_store/checkout/login.html.erb +2 -0
  89. data/app/views/caboose_store/checkout/payment.html.erb +79 -0
  90. data/app/views/caboose_store/checkout/relay.html.erb +12 -0
  91. data/app/views/caboose_store/checkout/relay_postMessage.html.erb +19 -0
  92. data/app/views/caboose_store/checkout/shipping.html.erb +8 -83
  93. data/app/views/caboose_store/checkout/step_one.html.erb +15 -0
  94. data/app/views/caboose_store/checkout/step_two.html.erb +15 -0
  95. data/app/views/caboose_store/checkout/thanks.html.erb +5 -0
  96. data/app/views/caboose_store/layouts/_footer.html.erb +1 -1
  97. data/app/views/caboose_store/orders/admin_edit.html.erb +101 -7
  98. data/app/views/caboose_store/orders/admin_index.html.erb +8 -8
  99. data/app/views/caboose_store/orders_mailer/customer_new_order.html.erb +0 -46
  100. data/app/views/caboose_store/orders_mailer/customer_status_updated.html.erb +0 -48
  101. data/app/views/caboose_store/orders_mailer/fulfillment_new_order.html.erb +0 -42
  102. data/app/views/caboose_store/orders_mailer/shipping_order_ready.html.erb +0 -45
  103. data/app/views/caboose_store/products/_admin_header.html.erb +7 -6
  104. data/app/views/caboose_store/products/_sort_options.html.erb +19 -0
  105. data/app/views/caboose_store/products/admin_add_upcs.html.erb +58 -0
  106. data/app/views/caboose_store/products/admin_edit_categories.html.erb +1 -1
  107. data/app/views/caboose_store/products/admin_edit_description.html.erb +2 -5
  108. data/app/views/caboose_store/products/admin_edit_general.html.erb +58 -1
  109. data/app/views/caboose_store/products/admin_edit_images.html.erb +3 -1
  110. data/app/views/caboose_store/products/admin_edit_variants.html.erb +13 -2
  111. data/app/views/caboose_store/products/admin_edit_variants_single.html.erb +14 -14
  112. data/app/views/caboose_store/products/admin_group_variants.html.erb +433 -0
  113. data/app/views/caboose_store/products/admin_index.html.erb +87 -39
  114. data/app/views/caboose_store/products/admin_sort.html copy.erb +155 -0
  115. data/app/views/caboose_store/products/admin_sort.html.erb +254 -0
  116. data/app/views/caboose_store/products/details.html.erb +1 -2
  117. data/app/views/caboose_store/variants/admin_edit.html.erb +18 -16
  118. data/app/views/caboose_store/variants/admin_group.html.erb +184 -0
  119. data/app/views/caboose_store/vendors/admin_edit.html.erb +24 -0
  120. data/app/views/caboose_store/vendors/admin_index.html.erb +30 -0
  121. data/app/views/caboose_store/vendors/admin_new.html.erb +34 -0
  122. data/config/routes.rb +65 -27
  123. data/lib/caboose-store/caboose_store_helper.rb +29 -30
  124. data/lib/caboose-store/engine.rb +73 -28
  125. data/lib/caboose-store/version.rb +1 -1
  126. data/lib/caboose-store.rb +16 -7
  127. data/lib/tasks/caboose-store.rake +0 -2
  128. metadata +54 -17
  129. data/app/assets/javascripts/caboose_store/modal.js +0 -52
  130. data/app/assets/javascripts/caboose_store/modal_integration.js +0 -25
  131. data/app/assets/javascripts/caboose_store/model.form.page.js +0 -30
  132. data/app/assets/javascripts/caboose_store/model.form.user.js +0 -36
  133. data/app/assets/javascripts/caboose_store/payment_processors/authorizenet.js +0 -21
  134. data/app/assets/javascripts/caboose_store/payment_processors/base.js +0 -21
  135. data/app/assets/javascripts/caboose_store/payment_processors/payscape.js +0 -21
  136. data/app/assets/javascripts/caboose_store/shortcut.js +0 -11
  137. data/app/assets/javascripts/caboose_store/station.js +0 -60
  138. data/app/models/caboose_store/order_line_item.rb +0 -13
  139. data/app/models/caboose_store/states.rb +0 -60
  140. data/app/views/caboose_store/application/_category_thumb.html.erb +0 -6
  141. data/app/views/caboose_store/application/_product_thumb.html.erb +0 -13
  142. data/app/views/caboose_store/checkout/quantity_box.html.erb +0 -39
  143. data/app/views/caboose_store/checkout/thank_you.html.erb +0 -36
@@ -0,0 +1,20 @@
1
+ //
2
+ // Main
3
+ //
4
+
5
+
6
+ Caboose.Store = (function(caboose) {
7
+ var self = {
8
+ Modules: {}
9
+ };
10
+
11
+ self.initialize = function() {
12
+ _.each(self.Modules, function(module) {
13
+ if (module.initialize) module.initialize();
14
+ });
15
+ };
16
+
17
+ $(document).ready(self.initialize);
18
+ return self;
19
+ }).call(Caboose);
20
+
@@ -0,0 +1,167 @@
1
+ //
2
+ // Cart
3
+ //
4
+
5
+ Caboose.Store.Modules.Cart = (function() {
6
+ var self = {
7
+ templates: {
8
+ lineItems: JST['caboose_store/cart/line_items'],
9
+ addToCart: JST['caboose_store/cart/add_to_cart']
10
+ }
11
+ };
12
+
13
+ //
14
+ // Initialize
15
+ //
16
+
17
+ self.initialize = function() {
18
+ self.renderAddToCart();
19
+ self.renderItemCount();
20
+ self.$cart = $('#cart');
21
+ if (!self.$cart.length) return false;
22
+ self.$cart.on('click', '#remove-from-cart', self.removeHandler);
23
+ self.$cart.on('keyup', 'input', self.updateHandler);
24
+ self.render();
25
+ };
26
+
27
+ //
28
+ // Set Variant
29
+ //
30
+
31
+ self.setVariant = function(variant) {
32
+ if (self.$addToCart) {
33
+ self.$addToCart.find('input[name=variant_id]').val(variant ? variant.id : "");
34
+ self.$addToCart.trigger('change');
35
+ }
36
+ };
37
+
38
+ //
39
+ // Render
40
+ //
41
+
42
+ self.render = function() {
43
+ $.get('/cart/items', function(response) {
44
+ self.$cart.empty().html(self.templates.lineItems({ order: response.order }));
45
+ self.$cart.removeClass('loading');
46
+ });
47
+ };
48
+
49
+ self.renderAddToCart = function() {
50
+ self.$addToCart = $('#add-to-cart');
51
+ if (!self.$addToCart.length) return false;
52
+ self.$addToCart.empty().html(self.templates.addToCart());
53
+ $('input[name=quantity]', self.$addToCart).on('keyup', self.quantityKeyupHandler);
54
+ $('form', self.$addToCart).on('submit', self.addHandler);
55
+ };
56
+
57
+ self.renderItemCount = function(itemCount) {
58
+ var $link = $('#cart-link, .cart-link');
59
+ if (!$link.length) return false;
60
+
61
+ function setCount(count) {
62
+ if ($link.children('i') && count < 1) {
63
+ $link.children('i').remove();
64
+ } else if ($link.children('i').length) {
65
+ $link.children('i').empty().text(count);
66
+ } else {
67
+ $link.append($('<i/>').text(count));
68
+ }
69
+ };
70
+
71
+ if (itemCount) {
72
+ setCount(itemCount);
73
+ } else {
74
+ $.get('/cart/item-count', function(response) {
75
+ setCount(response.item_count);
76
+ });
77
+ }
78
+ };
79
+
80
+ //
81
+ // Event Handlers
82
+ //
83
+
84
+ self.quantityKeyupHandler = function(event) {
85
+ var $quantity = $(event.target);
86
+ $quantity.val($quantity.val().match(/\d*\.?\d+/));
87
+ };
88
+
89
+ self.addHandler = function(event) {
90
+ event.preventDefault();
91
+ var $form = $(event.target);
92
+
93
+ if ($form.find('input[name=variant_id]').val().trim() == "") {
94
+ alert('Must select all options');
95
+ } else {
96
+ $.ajax({
97
+ type: $form.attr('method'),
98
+ url: $form.attr('action'),
99
+ data: $form.serialize(),
100
+ success: function(response) {
101
+ if (response.success) {
102
+ self.renderItemCount(response.item_count);
103
+ if (self.$addToCart.length) self.$addToCart.trigger('added');
104
+
105
+ if (!self.$addToCart.find('.message').length) {
106
+ self.$addToCart.append($('<p/>').hide().addClass('message').text('Successfully added to cart'));
107
+ self.$addToCart.find('.message').fadeIn();
108
+
109
+ setTimeout(function() {
110
+ self.$addToCart.find('.message').fadeOut(function() { $(this).remove() });
111
+ }, 1000);
112
+ }
113
+ } else {
114
+ alert(response.errors[0]);
115
+ }
116
+ }
117
+ });
118
+ }
119
+ };
120
+
121
+ self.updateHandler = function(event) {
122
+ var $quantity = $(event.target)
123
+ , $lineItem = $quantity.parents('li').first();
124
+
125
+ $quantity.val($quantity.val().match(/\d*\.?\d+/));
126
+ if ($quantity.val() == "") return false;
127
+
128
+ delay(function() {
129
+ $.ajax({
130
+ type: 'put',
131
+ url: '/cart/items/' + $lineItem.data('id'),
132
+ data: { quantity: $quantity.val() },
133
+ success: function(response) {
134
+ if (response.success) {
135
+ $lineItem.find('.price').empty().text('$' + response.line_item.price);
136
+ if (self.$cart.find('.subtotal').length) self.$cart.find('.subtotal').empty().text('$' + response.order_subtotal);
137
+ } else {
138
+ alert(response.errors[0]);
139
+ }
140
+ }
141
+ });
142
+ }, 1000);
143
+ };
144
+
145
+ self.removeHandler = function(event) {
146
+ var $lineItem = $(event.target).parents('li').first();
147
+
148
+ $.ajax({
149
+ type: 'delete',
150
+ url: '/cart/items/' + $lineItem.data('id'),
151
+ success: function(response) {
152
+ if (response.success) {
153
+ self.render();
154
+ self.renderItemCount(response.item_count);
155
+ }
156
+ }
157
+ });
158
+ };
159
+
160
+ self.redirectHandler = function(event) {
161
+ event.preventDefault();
162
+ window.location = $(event.target).attr('href');
163
+ };
164
+
165
+ return self;
166
+ }).call(Caboose.Store);
167
+
@@ -0,0 +1,313 @@
1
+ //
2
+ // Checkout
3
+ //
4
+
5
+ Caboose.Store.Modules.Checkout = (function() {
6
+ self = {
7
+ templates: {
8
+ address: JST['caboose_store/checkout/address'],
9
+ login: JST['caboose_store/checkout/login'],
10
+ payment: JST['caboose_store/checkout/payment'],
11
+ lineItems: JST['caboose_store/checkout/line_items'],
12
+ shipping: JST['caboose_store/checkout/shipping'],
13
+ forms: {
14
+ signin: JST['caboose_store/checkout/forms/signin'],
15
+ register: JST['caboose_store/checkout/forms/register'],
16
+ guest: JST['caboose_store/checkout/forms/guest']
17
+ }
18
+ }
19
+ };
20
+
21
+ //
22
+ // Initialize
23
+ //
24
+
25
+ self.initialize = function() {
26
+ switch (window.location.pathname.replace(/\/$/, "")) {
27
+ case '/checkout':
28
+ case '/checkout/step-one':
29
+ self.step = 1;
30
+ break;
31
+ case '/checkout/step-two':
32
+ self.step = 2;
33
+ break;
34
+ }
35
+
36
+ self.$checkout = $('#checkout')
37
+ if (!self.$checkout.length) return false;
38
+ self.loggedIn = $('body').data('logged-in');
39
+
40
+ // TODO refactor this
41
+ if (self.loggedIn) {
42
+ $.post('/checkout/attach-user', function(response) {
43
+ self.fetch(self.render);
44
+ });
45
+ } else {
46
+ self.fetch(self.render);
47
+ }
48
+
49
+ self.bindEventHandlers();
50
+ };
51
+
52
+ //
53
+ // Fetch
54
+ //
55
+
56
+ self.fetch = function(callback) {
57
+ $.get('/cart/items', function(response) {
58
+ self.order = response.order
59
+
60
+ if (self.step == 2) {
61
+ $.get('/checkout/shipping', function(response) {
62
+ self.shippingRates = response.rates;
63
+ self.selectedRate = response.selected_rate;
64
+ callback();
65
+ });
66
+ } else {
67
+ callback();
68
+ }
69
+ });
70
+ };
71
+
72
+ //
73
+ // Events
74
+ //
75
+
76
+ self.bindEventHandlers = function() {
77
+ self.$checkout.on('click', '[data-login-action]', self.loginClickHandler);
78
+ self.$checkout.on('submit', '#checkout-login form', self.loginSubmitHandler);
79
+ self.$checkout.on('change', 'input[type=checkbox][name=use_as_billing]', self.useAsBillingHandler);
80
+ self.$checkout.on('click', '#checkout-continue button', self.continueHandler);
81
+ self.$checkout.on('click', '#checkout-complete button', self.completeHandler);
82
+ self.$checkout.on('change', '#checkout-shipping select', self.shippingChangeHandler);
83
+ self.$checkout.on('change', '#checkout-payment form#payment select', self.expirationChangeHandler);
84
+ self.$checkout.on('submit', '#checkout-payment form#payment', self.paymentSubmitHandler);
85
+ };
86
+
87
+ self.loginClickHandler = function(event) {
88
+ $section = self.$login.children('section');
89
+
90
+ switch ($(event.target).data('login-action')) {
91
+ case 'signin':
92
+ $section.empty().html(self.templates.forms.signin());
93
+ break;
94
+ case 'register':
95
+ $section.empty().html(self.templates.forms.register());
96
+ break;
97
+ case 'continue':
98
+ $section.empty().html(self.templates.forms.guest());
99
+ break;
100
+ };
101
+ };
102
+
103
+ self.loginSubmitHandler = function(event) {
104
+ event.preventDefault();
105
+ var $form = $(event.target);
106
+
107
+ $.ajax({
108
+ type: $form.attr('method'),
109
+ url: $form.attr('action'),
110
+ data: $form.serialize(),
111
+ success: function(response) {
112
+ if (response.error || (response.errors && response.errors.length > 0)) {
113
+ if ($form.find('.message').length) {
114
+ $form.find('.message').empty().addClass('error').text(response.error || response.errors[0]);
115
+ } else {
116
+ $form.append($('<span/>').addClass('message error').text(response.error || response.errors[0]));
117
+ }
118
+ } else {
119
+ if (response.logged_in) {
120
+ self.$login.after($('<p/>').addClass('alert').text('You are now signed in').css('text-align', 'center')).remove();
121
+ $.post('/checkout/attach-user');
122
+ } else {
123
+ self.$login.after($('<p/>').addClass('alert').text('Email successfully saved').css('text-align', 'center')).remove();
124
+ }
125
+ }
126
+
127
+ self.fetch();
128
+ }
129
+ });
130
+ };
131
+
132
+ self.useAsBillingHandler = function(event) {
133
+ if (event.target.checked) {
134
+ self.$address.find('#billing').hide();
135
+ } else {
136
+ self.$address.find('#billing').show();
137
+ }
138
+ };
139
+
140
+ self.continueHandler = function(event) {
141
+ $form = self.$address.find('form');
142
+
143
+ if (!self.order.email && !self.order.customer_id) {
144
+ alert('Please sign in, register or choose to continue as a guest');
145
+ return false;
146
+ }
147
+
148
+ $.ajax({
149
+ type: $form.attr('method'),
150
+ url: $form.attr('action'),
151
+ data: $form.serialize(),
152
+ success: function(response) {
153
+ if (response.success) {
154
+ window.location = '/checkout/step-two';
155
+ } else {
156
+ $form.find('.message').remove();
157
+ $form.find('#' + response.address + ' h3').append($('<span/>').addClass('message error').text(response.errors[0]));
158
+ }
159
+ }
160
+ });
161
+ };
162
+
163
+ self.shippingChangeHandler = function(event) {
164
+ if (event.target.value == "") return false;
165
+ self.$checkout.addClass('loading');
166
+
167
+ $.ajax({
168
+ url: '/checkout/shipping',
169
+ type: 'put',
170
+ data: { shipping_code: event.target.value },
171
+ success: function(response) {
172
+ if (response.success) {
173
+ self.order = response.order;
174
+ self.selectedRate = response.selected_rate;
175
+ self.render();
176
+ }
177
+ }
178
+ });
179
+ };
180
+
181
+ self.expirationChangeHandler = function(event) {
182
+ var $form = $('#checkout-payment #payment')
183
+ , month = $form.find('select[name=month]').val()
184
+ , year = $form.find('select[name=year]').val();
185
+
186
+ $form.find('#expiration').val(month + year);
187
+ };
188
+
189
+ self.completeHandler = function(event) {
190
+ if (self.$payment.length) self.$payment.find('form').submit();
191
+ };
192
+
193
+ self.paymentSubmitHandler = function(event) {
194
+ event.preventDefault();
195
+
196
+ if (!self.order.shipping_code) {
197
+ alert('Please choose a shipping method');
198
+ } else {
199
+ self.$checkout.off('submit', '#checkout-payment form#payment').addClass('loading');
200
+ $(event.target).submit();
201
+ }
202
+ };
203
+
204
+ self.relayHandler = function(event) {
205
+ var $iframe = $(event.target)
206
+ , $form = self.$payment.find('form')
207
+ , $response = $iframe.contents().find('#response');
208
+
209
+ if (!$response.length || !$form.length) return false;
210
+ var response = JSON.parse($iframe.contents().find('#response').html());
211
+ console.log(response);
212
+ if (response.success == true) {
213
+ window.location = '/checkout/thanks';
214
+ } else {
215
+ alert(response.message);
216
+ self.render();
217
+ }
218
+ };
219
+
220
+ //
221
+ // Render
222
+ //
223
+
224
+ self.render = function() {
225
+ var renderFunctions = [];
226
+
227
+ if (self.step == 1) {
228
+ renderFunctions.push(self.renderLineItems);
229
+ renderFunctions.push(self.renderLogin);
230
+ renderFunctions.push(self.renderAddress);
231
+ } else {
232
+ renderFunctions.push(self.renderShipping);
233
+ renderFunctions.push(self.renderLineItems);
234
+ renderFunctions.push(self.renderPayment);
235
+ }
236
+
237
+ _.each(renderFunctions, function(renderFunction, index) {
238
+ var finished = index == (renderFunctions.length - 1)
239
+
240
+ renderFunction(function() {
241
+ if (finished) self.$checkout.removeClass('loading');
242
+ });
243
+ });
244
+ };
245
+
246
+ self.renderLineItems = function(callback) {
247
+ self.$lineItems = self.$checkout.find('#checkout-line-items');
248
+ if (!self.$lineItems.length) return false;
249
+ self.$lineItems.empty().html(self.templates.lineItems({ order: self.order }));
250
+ if (callback) callback();
251
+ };
252
+
253
+ self.renderLogin = function(callback) {
254
+ self.$login = self.$checkout.find('#checkout-login');
255
+ if (self.loggedIn) self.$login.remove();
256
+ if (self.loggedIn || !self.$login.length) return false;
257
+ self.$login.html(self.templates.login());
258
+ if (!self.order.email) self.$login.find('button[data-login-action="signin"]').click();
259
+ if (callback) callback();
260
+ };
261
+
262
+ self.renderAddress = function(callback) {
263
+ self.$address = self.$checkout.find('#checkout-address');
264
+ if (!self.$address.length) return false;
265
+
266
+ self.$address.empty().html(self.templates.address({
267
+ shippingAddress: self.order.shipping_address,
268
+ billingAddress: self.order.billing_address,
269
+ states: window.States
270
+ }));
271
+
272
+ if (callback) callback();
273
+ };
274
+
275
+ self.renderShipping = function(callback) {
276
+ self.$shipping = self.$checkout.find('#checkout-shipping');
277
+ if (!self.$shipping.length) return false;
278
+
279
+ self.$shipping.empty().html(self.templates.shipping({
280
+ rates: self.shippingRates,
281
+ selectedRate: self.selectedRate
282
+ }));
283
+
284
+ if (callback) callback();
285
+ };
286
+
287
+ self.renderPayment = function(callback) {
288
+ self.$payment = self.$checkout.find('#checkout-payment');
289
+ if (!self.$payment.length) return false;
290
+ self.$checkout.addClass('loading');
291
+
292
+ $.get('/checkout/payment', function(response) {
293
+ var serializedForm = self.$payment.find('form').serialize();
294
+ self.$payment.empty().html(self.templates.payment({ form: response }));
295
+
296
+ if (serializedForm.length > 0) {
297
+ _.each(serializedForm.split('&'), function(serializedField) {
298
+ var name = serializedField.split('=')[0]
299
+ , value = serializedField.split('=')[1];
300
+
301
+ self.$payment.find('form [name="' + name + '"]').val(value);
302
+ });
303
+ }
304
+
305
+ self.expirationChangeHandler();
306
+ self.$checkout.removeClass('loading');
307
+ self.$payment.find('iframe').on('load', self.relayHandler);
308
+ });
309
+ };
310
+
311
+ return self
312
+ }).call(Caboose.Store);
313
+