summaryrefslogtreecommitdiff
path: root/addons/website_quote/static/src/js/website_quotation.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/website_quote/static/src/js/website_quotation.js')
-rw-r--r--addons/website_quote/static/src/js/website_quotation.js168
1 files changed, 150 insertions, 18 deletions
diff --git a/addons/website_quote/static/src/js/website_quotation.js b/addons/website_quote/static/src/js/website_quotation.js
index 04705686f32..6985625c378 100644
--- a/addons/website_quote/static/src/js/website_quotation.js
+++ b/addons/website_quote/static/src/js/website_quotation.js
@@ -15,28 +15,160 @@ if(!$('.o_website_quote').length) {
events: {
'click' : 'onClick',
},
- onClick: function(ev){
- ev.preventDefault();
+ /**
+ * @override
+ */
+ start: function () {
var self = this;
- var href = this.$el.attr("href");
- var order_id = href.match(/order_id=([0-9]+)/);
- var line_id = href.match(/update_line\/([0-9]+)/);
- var token = href.match(/token=(.*)/);
- ajax.jsonRpc("/quote/update_line", 'call', {
- 'line_id': line_id[1],
- 'order_id': parseInt(order_id[1]),
- 'token': token[1],
- 'remove': self.$el.is('[href*="remove"]'),
- 'unlink': self.$el.is('[href*="unlink"]')
- }).then(function (data) {
- if(!data){
- location.reload();
- }
- self.$el.parents('.input-group:first').find('.js_quantity').val(data[0]);
- $('[data-id="total_amount"]>span').html(data[1]);
+ return this._super.apply(this, arguments).then(function () {
+ self.elems = self._getUpdatableElements();
+ self.elems.$lineQuantity.change(function (ev) {
+ var quantity = parseInt(this.value);
+ self._onChangeQuantity(quantity);
+ });
});
+ },
+ /**
+ * Process the change in line quantity
+ *
+ * @private
+ * @param {Int} quantity, the new quantity of the line
+ * If not present it will increment/decrement the existing quantity
+ */
+ _onChangeQuantity: function (quantity) {
+ var href = this.$el.attr("href");
+ var order_id = href.match(/order_id=([0-9]+)/)[1];
+ var line_id = href.match(/update_line(_dict)?\/([0-9]+)/)[2];
+ var token = href.match(/token=([\w\d-]*)/)[1];
+
+ var callParams = {
+ 'line_id': parseInt(line_id),
+ 'order_id': parseInt(order_id),
+ 'token': token,
+ 'remove': this.$el.is('[href*="remove"]'),
+ 'unlink': this.$el.is('[href*="unlink"]'),
+ 'input_quantity': quantity >= 0 ? quantity : false,
+ };
+ this._callUpdateLineRoute(callParams).then(this._updateOrderValues.bind(this));
return false;
},
+ /**
+ * Reacts to the click on the -/+ buttons
+ *
+ * @param {Event} ev
+ */
+ onClick: function (ev) {
+ ev.preventDefault();
+ return this._onChangeQuantity();
+ },
+ /**
+ * Calls the route to get updated values of the line and order
+ * when the quantity of a product has changed
+ *
+ * @private
+ * @param {Object} params
+ * @return {Deferred}
+ */
+ _callUpdateLineRoute: function (params) {
+ var def = new $.Deferred();
+ ajax.jsonRpc("/quote/update_line_dict", 'call', params)
+ .then(def.resolve.bind(def))
+ .fail(function () {
+ // Compatibility: the server may not have been restarted
+ // So the real route may not exist
+ delete params.input_quantity;
+ ajax.jsonRpc("/quote/update_line", 'call', params)
+ .fail(def.reject.bind(def))
+ .then(function (data) {
+ // Data is an array, convert it to a dict
+ var actualData = data;
+ if (data) {
+ actualData = {
+ order_amount_total: data[1],
+ order_line_product_uom_qty: data[0],
+ };
+ }
+ def.resolve(actualData);
+ });
+ });
+ return def;
+ },
+ /**
+ * Processes data from the server to update the UI
+ *
+ * @private
+ * @param {Object} data: contains order and line updated values
+ */
+ _updateOrderValues: function (data) {
+ if (!data) {
+ window.location.reload();
+ }
+
+ var orderAmountTotal = data.order_amount_total;
+ var orderAmountUntaxed = data.order_amount_untaxed;
+ var orderAmountTax = data.order_amount_tax;
+
+ var lineProductUomQty = data.order_line_product_uom_qty;
+ var linePriceTotal = data.order_line_price_total;
+ var linePriceSubTotal = data.order_line_price_subtotal;
+
+ this.elems.$lineQuantity.val(lineProductUomQty)
+
+ if (this.elems.$linePriceTotal.length && linePriceTotal !== undefined) {
+ this.elems.$linePriceTotal.text(linePriceTotal);
+ }
+ if (this.elems.$linePriceSubTotal.length && linePriceSubTotal !== undefined) {
+ this.elems.$linePriceSubTotal.text(linePriceSubTotal);
+ }
+
+ if (orderAmountUntaxed !== undefined) {
+ this.elems.$orderAmountUntaxed.text(orderAmountUntaxed);
+ }
+
+ if (orderAmountTax !== undefined) {
+ this.elems.$orderAmountTax.text(orderAmountTax);
+ }
+
+ if (orderAmountTotal !== undefined) {
+ this.elems.$orderAmountTotal.text(orderAmountTotal);
+ }
+ },
+ /**
+ * Locate in the DOM the elements to update
+ * Mostly for compatibility, when the module has not been upgraded
+ * In that case, we need to fall back to some other elements
+ *
+ * @private
+ * @return {Object}: Jquery elements to update
+ */
+ _getUpdatableElements: function () {
+ var $parentTr = this.$el.parents('tr:first');
+ var $linePriceTotal = $parentTr.find('.oe_order_line_price_total .oe_currency_value');
+ var $linePriceSubTotal = $parentTr.find('.oe_order_line_price_subtotal .oe_currency_value');
+
+ if (!$linePriceTotal.length && !$linePriceSubTotal.length) {
+ $linePriceTotal = $linePriceSubTotal = $parentTr.find('.oe_currency_value').last();
+ }
+
+ var $orderAmountUntaxed = $('[data-id="total_untaxed"]>span');
+ var $orderAmountTax = $('[data-id="total_taxes"]>span');
+ var $orderAmountTotal = $('[data-id="total_amount"]>span');
+
+ if (!$orderAmountUntaxed.length && !$orderAmountTax.length) {
+ $orderAmountUntaxed = $orderAmountTotal.eq(1);
+ $orderAmountTax = $orderAmountTotal.eq(2);
+ $orderAmountTotal = $orderAmountTotal.eq(0).add($orderAmountTotal.eq(3));
+ }
+
+ return {
+ $lineQuantity: this.$el.parents('.input-group:first').find('.js_quantity'),
+ $linePriceSubTotal: $linePriceSubTotal,
+ $linePriceTotal: $linePriceTotal,
+ $orderAmountUntaxed: $orderAmountUntaxed,
+ $orderAmountTax: $orderAmountTax,
+ $orderAmountTotal: $orderAmountTotal,
+ }
+ }
});
var update_button_list = [];