blob: 27f604f976ab9c23ef624c7b72658679104d142e [file] [log] [blame]
Anand Doshiab690292013-06-13 11:21:35 +05301// ERPNext - web based ERP (http://erpnext.com)
2// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17// js inside blog page
18
19$(document).ready(function() {
20 // make list of items in the cart
Anand Doshi3dceb842013-06-19 14:57:14 +053021 // wn.cart.render();
Anand Doshic2a35272013-06-19 17:19:20 +053022 wn.cart.bind_events();
Anand Doshi3dceb842013-06-19 14:57:14 +053023 wn.call({
Anand Doshic2a35272013-06-19 17:19:20 +053024 type: "POST",
Anand Doshi3dceb842013-06-19 14:57:14 +053025 method: "website.helpers.cart.get_cart_quotation",
Anand Doshi3dceb842013-06-19 14:57:14 +053026 callback: function(r) {
27 console.log(r);
28 $("#cart-container").removeClass("hide");
29 $(".progress").remove();
30 if(r.exc) {
31 if(r.exc.indexOf("WebsitePriceListMissingError")!==-1) {
32 wn.cart.show_error("Oops!", "Price List not configured.");
Anand Doshiedbf3e12013-07-02 11:40:16 +053033 } else if(r["403"]) {
34 wn.cart.show_error("Hey!", "You need to be logged in to view your cart.");
Anand Doshi3dceb842013-06-19 14:57:14 +053035 } else {
36 wn.cart.show_error("Oops!", "Something went wrong.");
37 }
38 } else {
Anand Doshic2a35272013-06-19 17:19:20 +053039 wn.cart.render(r.message);
Anand Doshi3dceb842013-06-19 14:57:14 +053040 }
Anand Doshi3dceb842013-06-19 14:57:14 +053041 }
42 });
Anand Doshiab690292013-06-13 11:21:35 +053043});
44
45// shopping cart
46if(!wn.cart) wn.cart = {};
47$.extend(wn.cart, {
Anand Doshi3dceb842013-06-19 14:57:14 +053048 show_error: function(title, text) {
49 $("#cart-container").html('<div class="well"><h4>' + title + '</h4> ' + text + '</div>');
50 },
51
Anand Doshic2a35272013-06-19 17:19:20 +053052 bind_events: function() {
53 // bind update button
54 $(document).on("click", ".item-update-cart button", function() {
Anand Doshic2a35272013-06-19 17:19:20 +053055 var item_code = $(this).attr("data-item-code");
56 wn.cart.update_cart({
57 item_code: item_code,
58 qty: $('input[data-item-code="'+item_code+'"]').val(),
59 with_doclist: 1,
60 btn: this,
61 callback: function(r) {
62 if(!r.exc) {
63 wn.cart.render(r.message);
64 var $button = $('button[data-item-code="'+item_code+'"]').addClass("btn-success");
65 setTimeout(function() { $button.removeClass("btn-success"); }, 1000);
66 }
67 },
68 });
69 });
Anand Doshiedbf3e12013-07-02 11:40:16 +053070
71 $("#cart-add-shipping-address").on("click", function() {
72 window.location.href = "address?address_fieldname=shipping_address_name";
73 });
74
75 $("#cart-add-billing-address").on("click", function() {
76 window.location.href = "address?address_fieldname=customer_address";
77 });
Anand Doshic2a35272013-06-19 17:19:20 +053078 },
79
Anand Doshiedbf3e12013-07-02 11:40:16 +053080 render: function(out) {
81 var doclist = out.doclist;
82 var addresses = out.addresses;
Anand Doshi0b4943c2013-07-04 23:45:22 +053083
Anand Doshiedbf3e12013-07-02 11:40:16 +053084 var $cart_items = $("#cart-items").empty();
85 var $cart_taxes = $("#cart-taxes").empty();
Anand Doshi0b4943c2013-07-04 23:45:22 +053086 var $cart_totals = $("#cart-totals").empty();
Anand Doshiedbf3e12013-07-02 11:40:16 +053087 var $cart_billing_address = $("#cart-billing-address").empty();
88 var $cart_shipping_address = $("#cart-shipping-address").empty();
Anand Doshic2a35272013-06-19 17:19:20 +053089
Anand Doshiedbf3e12013-07-02 11:40:16 +053090 var no_items = $.map(doclist, function(d) { return d.item_code || null;}).length===0;
91 if(no_items) {
Anand Doshic2a35272013-06-19 17:19:20 +053092 wn.cart.show_error("Empty :-(", "Go ahead and add something to your cart.");
Anand Doshiedbf3e12013-07-02 11:40:16 +053093 $("#cart-addresses").toggle(false);
Anand Doshic2a35272013-06-19 17:19:20 +053094 return;
95 }
96
Anand Doshi0b4943c2013-07-04 23:45:22 +053097 var shipping_rule_added = false;
98 var taxes_exist = false;
Anand Doshi2862c9e2013-07-08 18:50:33 +053099 var shipping_rule_labels = $.map(out.shipping_rules || [], function(rule) { return rule[1]; });
Anand Doshic2a35272013-06-19 17:19:20 +0530100 $.each(doclist, function(i, doc) {
101 if(doc.doctype === "Quotation Item") {
Anand Doshiedbf3e12013-07-02 11:40:16 +0530102 wn.cart.render_item_row($cart_items, doc);
Anand Doshi0b4943c2013-07-04 23:45:22 +0530103 } else if (doc.doctype === "Sales Taxes and Charges") {
104 if(out.shipping_rules && out.shipping_rules.length &&
105 shipping_rule_labels.indexOf(doc.description)!==-1) {
106 shipping_rule_added = true;
107 wn.cart.render_tax_row($cart_taxes, doc, out.shipping_rules);
108 } else {
109 wn.cart.render_tax_row($cart_taxes, doc);
110 }
111
112 taxes_exist = true;
Anand Doshic2a35272013-06-19 17:19:20 +0530113 }
114 });
115
Anand Doshi0b4943c2013-07-04 23:45:22 +0530116 if(out.shipping_rules && out.shipping_rules.length && !shipping_rule_added) {
117 wn.cart.render_tax_row($cart_taxes, {description: "", formatted_tax_amount: ""},
118 out.shipping_rules);
119 taxes_exist = true;
120 }
121
122 if(taxes_exist)
123 $('<hr>').appendTo($cart_taxes);
124
125 wn.cart.render_tax_row($cart_totals, {
126 description: "<strong>Total</strong>",
127 formatted_tax_amount: "<strong>" + doclist[0].formatted_grand_total_export + "</strong>"
128 });
129
Anand Doshiedbf3e12013-07-02 11:40:16 +0530130 if(!(addresses && addresses.length)) {
131 $cart_shipping_address.html('<div class="well">Hey! Go ahead and add an address</div>');
Anand Doshiab690292013-06-13 11:21:35 +0530132 } else {
Anand Doshiedbf3e12013-07-02 11:40:16 +0530133 wn.cart.render_address($cart_shipping_address, addresses, doclist[0].shipping_address_name);
134 wn.cart.render_address($cart_billing_address, addresses, doclist[0].customer_address);
Anand Doshiab690292013-06-13 11:21:35 +0530135 }
Anand Doshiabc10032013-06-14 17:44:03 +0530136 },
137
Anand Doshiedbf3e12013-07-02 11:40:16 +0530138 render_item_row: function($cart_items, doc) {
139 doc.image_html = doc.image ?
140 '<div style="height: 120px; overflow: hidden;"><img src="' + doc.image + '" /></div>' :
141 '{% include "app/website/templates/html/product_missing_image.html" %}';
142
143 if(!doc.web_short_description) doc.web_short_description = doc.description;
144
145 $(repl('<div class="row">\
146 <div class="col col-lg-9 col-sm-9">\
147 <div class="row">\
148 <div class="col col-lg-3">%(image_html)s</div>\
149 <div class="col col-lg-9">\
150 <h4><a href="%(page_name)s">%(item_name)s</a></h4>\
151 <p>%(web_short_description)s</p>\
152 </div>\
153 </div>\
154 </div>\
Anand Doshi0b4943c2013-07-04 23:45:22 +0530155 <div class="col col-lg-3 col-sm-3 text-right">\
Anand Doshiedbf3e12013-07-02 11:40:16 +0530156 <div class="input-group item-update-cart">\
157 <input type="text" placeholder="Qty" value="%(qty)s" \
Anand Doshi0b4943c2013-07-04 23:45:22 +0530158 data-item-code="%(item_code)s" class="text-right">\
Anand Doshiedbf3e12013-07-02 11:40:16 +0530159 <div class="input-group-btn">\
160 <button class="btn btn-primary" data-item-code="%(item_code)s">\
161 <i class="icon-ok"></i></button>\
162 </div>\
163 </div>\
164 <p style="margin-top: 10px;">at %(formatted_rate)s</p>\
165 <small class="text-muted" style="margin-top: 10px;">= %(formatted_amount)s</small>\
166 </div>\
167 </div><hr>', doc)).appendTo($cart_items);
168 },
169
Anand Doshi0b4943c2013-07-04 23:45:22 +0530170 render_tax_row: function($cart_taxes, doc, shipping_rules) {
171 var shipping_selector;
172 if(shipping_rules) {
173 shipping_selector = '<select>' + $.map(shipping_rules, function(rule) {
174 return '<option value="' + rule[0] + '">' + rule[1] + '</option>' }).join("\n") +
175 '</select>';
176 }
177
178 var $tax_row = $(repl('<div class="row">\
179 <div class="col col-lg-9 col-sm-9">\
180 <div class="row">\
181 <div class="col col-lg-9 col-offset-3">' +
182 (shipping_selector || '<p>%(description)s</p>') +
183 '</div>\
184 </div>\
185 </div>\
186 <div class="col col-lg-3 col-sm-3 text-right">\
187 <p' + (shipping_selector ? ' style="margin-top: 5px;"' : "") + '>%(formatted_tax_amount)s</p>\
188 </div>\
189 </div>', doc)).appendTo($cart_taxes);
190
191 if(shipping_selector) {
192 $tax_row.find('select option').each(function(i, opt) {
193 if($(opt).html() == doc.description) {
194 $(opt).attr("selected", "selected");
195 }
196 });
197 $tax_row.find('select').on("change", function() {
198 wn.cart.apply_shipping_rule($(this).val(), this);
199 });
200 }
201 },
202
203 apply_shipping_rule: function(rule, btn) {
204 wn.call({
205 btn: btn,
206 type: "POST",
207 method: "website.helpers.cart.apply_shipping_rule",
208 args: { shipping_rule: rule },
209 callback: function(r) {
210 if(!r.exc) {
211 wn.cart.render(r.message);
212 }
213 }
214 });
215 },
216
Anand Doshiedbf3e12013-07-02 11:40:16 +0530217 render_address: function($address_wrapper, addresses, address_name) {
218 $.each(addresses, function(i, address) {
219 $(repl('<div class="accordion-group"> \
220 <div class="accordion-heading"> \
221 <div class="row"> \
222 <div class="col col-lg-10 address-title" \
223 data-address-name="%(name)s"><strong>%(name)s</strong></div> \
224 <div class="col col-lg-2"><input type="checkbox" \
225 data-address-name="%(name)s"></div> \
226 </div> \
227 </div> \
228 <div class="accordion-body collapse" data-address-name="%(name)s"> \
229 <div class="accordion-inner">%(display)s</div> \
230 </div> \
231 </div>', address))
232 .css({"margin": "10px auto"})
233 .appendTo($address_wrapper);
234 });
235
236 $address_wrapper.find(".accordion-heading")
237 .css({
238 "background-color": "#eee",
239 "padding": "10px",
240 })
241 .find(".address-title")
242 .css({"cursor": "pointer"})
243 .on("click", function() {
244 $address_wrapper.find('.accordion-body[data-address-name="'
245 +$(this).attr("data-address-name")+'"]').collapse("toggle");
246 });
247
248 $address_wrapper.find('input[type="checkbox"]').on("click", function() {
249 if($(this).is(":checked")) {
250 var me = this;
251 $address_wrapper.find('input[type="checkbox"]').each(function(i, chk) {
252 if($(chk).attr("data-address-name")!=$(me).attr("data-address-name")) {
253 $(chk).removeAttr("checked");
254 }
255 });
256
257 wn.call({
258 type: "POST",
259 method: "website.helpers.cart.update_cart_address",
260 args: {
261 address_fieldname: $address_wrapper.attr("data-fieldname"),
262 address_name: $(this).attr("data-address-name")
263 },
264 callback: function(r) {
265 if(!r.exc) {
266 wn.cart.render(r.message);
267 }
268 }
269 });
270 } else {
271 return false;
272 }
273 });
274
275 $address_wrapper.find('input[type="checkbox"][data-address-name="'+ address_name +'"]')
276 .attr("checked", "checked");
277
278 $address_wrapper.find(".accordion-body").collapse({
279 parent: $address_wrapper,
280 toggle: false
281 });
282
283 $address_wrapper.find('.accordion-body[data-address-name="'+ address_name +'"]')
284 .collapse("show");
285 }
Anand Doshiab690292013-06-13 11:21:35 +0530286});