// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt // js inside blog page // shopping cart frappe.provide("erpnext.e_commerce.shopping_cart"); var shopping_cart = erpnext.e_commerce.shopping_cart; $.extend(shopping_cart, { show_error: function(title, text) { $("#cart-container").html('

' + title + '

' + text + '

'); }, bind_events: function() { shopping_cart.bind_address_picker_dialog(); shopping_cart.bind_place_order(); shopping_cart.bind_request_quotation(); shopping_cart.bind_change_qty(); shopping_cart.bind_remove_cart_item(); shopping_cart.bind_change_notes(); shopping_cart.bind_coupon_code(); }, bind_address_picker_dialog: function() { const d = this.get_update_address_dialog(); this.parent.find('.btn-change-address').on('click', (e) => { const type = $(e.currentTarget).parents('.address-container').attr('data-address-type'); $(d.get_field('address_picker').wrapper).html( this.get_address_template(type) ); d.show(); }); }, get_update_address_dialog() { let d = new frappe.ui.Dialog({ title: "Select Address", fields: [{ 'fieldtype': 'HTML', 'fieldname': 'address_picker', }], primary_action_label: __('Set Address'), primary_action: () => { const $card = d.$wrapper.find('.address-card.active'); const address_type = $card.closest('[data-address-type]').attr('data-address-type'); const address_name = $card.closest('[data-address-name]').attr('data-address-name'); frappe.call({ type: "POST", method: "erpnext.e_commerce.shopping_cart.cart.update_cart_address", freeze: true, args: { address_type, address_name }, callback: function(r) { d.hide(); if (!r.exc) { $(".cart-tax-items").html(r.message.total); shopping_cart.parent.find( `.address-container[data-address-type="${address_type}"]` ).html(r.message.address); } } }); } }); return d; }, get_address_template(type) { return { shipping: `
{% for address in shipping_addresses %}
{% include "templates/includes/cart/address_picker_card.html" %}
{% endfor %}
`, billing: `
{% for address in billing_addresses %}
{% include "templates/includes/cart/address_picker_card.html" %}
{% endfor %}
`, }[type]; }, bind_place_order: function() { $(".btn-place-order").on("click", function() { shopping_cart.place_order(this); }); }, bind_request_quotation: function() { $('.btn-request-for-quotation').on('click', function() { shopping_cart.request_quotation(this); }); }, bind_change_qty: function() { // bind update button $(".cart-items").on("change", ".cart-qty", function() { var item_code = $(this).attr("data-item-code"); var newVal = $(this).val(); shopping_cart.shopping_cart_update({item_code, qty: newVal}); }); $(".cart-items").on('click', '.number-spinner button', function () { var btn = $(this), input = btn.closest('.number-spinner').find('input'), oldValue = input.val().trim(), newVal = 0; if (btn.attr('data-dir') == 'up') { newVal = parseInt(oldValue) + 1; } else { if (oldValue > 1) { newVal = parseInt(oldValue) - 1; } } input.val(newVal); let notes = input.closest("td").siblings().find(".notes").text().trim(); var item_code = input.attr("data-item-code"); shopping_cart.shopping_cart_update({ item_code, qty: newVal, additional_notes: notes }); }); }, bind_change_notes: function() { $('.cart-items').on('change', 'textarea', function() { const $textarea = $(this); const item_code = $textarea.attr('data-item-code'); const qty = $textarea.closest('tr').find('.cart-qty').val(); const notes = $textarea.val(); shopping_cart.shopping_cart_update({ item_code, qty, additional_notes: notes }); }); }, bind_remove_cart_item: function() { $(".cart-items").on("click", ".remove-cart-item", (e) => { const $remove_cart_item_btn = $(e.currentTarget); var item_code = $remove_cart_item_btn.data("item-code"); shopping_cart.shopping_cart_update({ item_code: item_code, qty: 0 }); }); }, render_tax_row: function($cart_taxes, doc, shipping_rules) { var shipping_selector; if(shipping_rules) { shipping_selector = ''; } var $tax_row = $(repl('
\
\
\
' + (shipping_selector || '

%(description)s

') + '
\
\
\
\ %(formatted_tax_amount)s

\
\
', doc)).appendTo($cart_taxes); if(shipping_selector) { $tax_row.find('select option').each(function(i, opt) { if($(opt).html() == doc.description) { $(opt).attr("selected", "selected"); } }); $tax_row.find('select').on("change", function() { shopping_cart.apply_shipping_rule($(this).val(), this); }); } }, apply_shipping_rule: function(rule, btn) { return frappe.call({ btn: btn, type: "POST", method: "erpnext.e_commerce.shopping_cart.cart.apply_shipping_rule", args: { shipping_rule: rule }, callback: function(r) { if(!r.exc) { shopping_cart.render(r.message); } } }); }, place_order: function(btn) { shopping_cart.freeze(); return frappe.call({ type: "POST", method: "erpnext.e_commerce.shopping_cart.cart.place_order", btn: btn, callback: function(r) { if(r.exc) { shopping_cart.unfreeze(); var msg = ""; if(r._server_messages) { msg = JSON.parse(r._server_messages || []).join("
"); } $("#cart-error") .empty() .html(msg || frappe._("Something went wrong!")) .toggle(true); } else { $(btn).hide(); window.location.href = '/orders/' + encodeURIComponent(r.message); } } }); }, request_quotation: function(btn) { shopping_cart.freeze(); return frappe.call({ type: "POST", method: "erpnext.e_commerce.shopping_cart.cart.request_for_quotation", btn: btn, callback: function(r) { if(r.exc) { shopping_cart.unfreeze(); var msg = ""; if(r._server_messages) { msg = JSON.parse(r._server_messages || []).join("
"); } $("#cart-error") .empty() .html(msg || frappe._("Something went wrong!")) .toggle(true); } else { $(btn).hide(); window.location.href = '/quotations/' + encodeURIComponent(r.message); } } }); }, bind_coupon_code: function() { $(".bt-coupon").on("click", function() { shopping_cart.apply_coupon_code(this); }); }, apply_coupon_code: function(btn) { return frappe.call({ type: "POST", method: "erpnext.e_commerce.shopping_cart.cart.apply_coupon_code", btn: btn, args : { applied_code : $('.txtcoupon').val(), applied_referral_sales_partner: $('.txtreferral_sales_partner').val() }, callback: function(r) { if (r && r.message){ location.reload(); } } }); } }); frappe.ready(function() { $(".cart-icon").hide(); shopping_cart.parent = $(".cart-container"); shopping_cart.bind_events(); }); function show_terms() { var html = $(".cart-terms").html(); frappe.msgprint(html); }