PageSourceSearch

https://gruponovelec.com/_ui/responsive/common/js/acc.quickorder.js

js gruponovelec.com collected 2026-09-29 16:07:01 UTC 17,274 bytes, 362 lines download raw bytes

1var ACC = ACC || {}; // make sure ACC is available
2
3if ($("#quickOrder").length > 0) {
4    ACC.quickorder = {
5        _autoload: [
6            "bindClearQuickOrderRow",
7            "bindAddSkuInputRow",
8            "bindResetFormBtn",
9            "bindAddToCartClick"
10        ],
11
12        $quickOrderContainer: $('.js-quick-order-container'),
13        $quickOrderMinRows: Number($('.js-quick-order-container').data('quickOrderMinRows')),
14        $quickOrderMaxRows: Number($('.js-quick-order-container').data('quickOrderMaxRows')),
15        $productExistsInFormMsg: $('.js-quick-order-container').data('productExistsInFormMsg'),
16        $quickOrderLeavePageMsg: $('#quickOrder').data('gridConfirmMessage'),
17        $hiddenSkuInput: 'input.js-hidden-sku-field',
18        $addToCartBtn: $('#js-add-to-cart-quick-order-btn-top, #js-add-to-cart-quick-order-btn-bottom'),
19        $resetFormBtn: $('#js-reset-quick-order-form-btn-top, #js-reset-quick-order-form-btn-bottom'),
20        $productInfoContainer: '.js-product-info',
21        $skuInputField: '.js-sku-input-field',
22        $qtyInputField: '.js-quick-order-qty',
23        $jsLiContainer: 'li.js-li-container',
24        $removeQuickOrderRowBtn: '.js-remove-quick-order-row',
25        $skuValidationContainer: '.js-sku-validation-container',
26        $qtyValidationContainer: '.js-qty-validation-container',
27        $productItemTotal: '.js-quick-order-item-total',
28        $classHasError: 'has-error',
29		$stockVisible: '.stock-visible',
30
31        bindResetFormBtn: function () {
32            ACC.quickorder.$resetFormBtn.on("click", ACC.quickorder.clearForm);
33        },
34
35        bindAddToCartClick: function () {
36            ACC.quickorder.$addToCartBtn.on("click", ACC.quickorder.addToCart);
37        },
38
39        bindAddSkuInputRow: function () {
40            $(ACC.quickorder.$skuInputField).on("focusin", ACC.quickorder.addInputRow).on("focusout keydown", ACC.quickorder.handleFocusOutOnSkuInput);
41        },
42
43        bindClearQuickOrderRow: function () {
44            $(ACC.quickorder.$removeQuickOrderRowBtn).on("mousedown", ACC.quickorder.clearQuickOrderRow);
45        },
46
47        addToCart: function () {
48            $.ajax({
49                url: ACC.quickorder.$quickOrderContainer.data('quickOrderAddToCartUrl'),
50                type: 'POST',
51                dataType: 'json',
52                contentType: 'application/json',
53                data: ACC.quickorder.getJSONDataForAddToCart(),
54                async: false,
55                success: function (response) {
56                    ACC.quickorder.handleAddToCartSuccess(response);
57                },
58                error: function (jqXHR, textStatus, errorThrown) {
59                    // log the error to the console
60                    console.log("The following error occurred: " + textStatus, errorThrown);
61                }
62            });
63        },
64
65        handleAddToCartSuccess: function (response) {
66            if ($(response.quickOrderErrorData).length > 0) {
67                ACC.quickorder.disableBeforeUnloadEvent();
68            }
69            var lookup = {};
70            response.quickOrderErrorData.forEach(function (el) {
71                lookup[el.sku] = el.errorMsg;
72            });
73
74            $(ACC.quickorder.$qtyInputField).each(function () {
75                var parentLi = ACC.quickorder.getCurrentParentLi(this);
76                var sku = ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuInputField).val();
77                var errorMsg = lookup[sku];
78
79                if (errorMsg) {
80                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).css('margin-left', '0px').text(errorMsg);
81                }
82                else {
83                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$removeQuickOrderRowBtn).trigger("mousedown");
84                }
85            });
86
87            ACC.quickorder.handleBeforeUnloadEvent();
88            ACC.product.displayAddToCartPopup(response);
89        },
90
91        getJSONDataForAddToCart: function () {
92            var skusAsJSON = [];
93            $(ACC.quickorder.$qtyInputField).each(function () {
94                var qty = Number($(this).val());
95                if (qty > 0) {
96                    var sku = jQuery.trim(ACC.quickorder.findElementInCurrentParentLi(this, ACC.quickorder.$skuInputField).val());
97                    skusAsJSON.push({"product": {"code": sku}, "quantity": qty});
98                }
99            });
100            return JSON.stringify({"cartEntries": skusAsJSON});
101        },
102
103        handleFocusOutOnSkuInput: function (event) {
104        	var key = event.charCode ? event.charCode : event.keyCode ? event.keyCode : 0;
105        	if (key == 13) {
106        		$(event.target).focusout();
107        	}
108        	if (event.type == "focusout") {
109        		ACC.quickorder.handleGetProduct(event);
110        		ACC.quickorder.handleBeforeUnloadEvent();
111        	}
112        },
113
114        handleFocusOutOnQtyInput: function (event) {
115        	var key = event.charCode ? event.charCode : event.keyCode ? event.keyCode : 0;
116        	if (key == 13) {	
117        		event.preventDefault();
118        		var parentLi = ACC.quickorder.getCurrentParentLi(event.target);        		
119        		parentLi.next().find(ACC.quickorder.$skuInputField).focus();
120        		$(event.target).focusout();
121        	}
122        	if (event.type == "focusout") {
123        		ACC.quickorder.validateAndUpdateItemTotal(event);
124        		ACC.quickorder.enableDisableAddToCartBtn();
125        	}
126        },
127
128        clearForm: function () {
129        	window.location.reload();
130        },
131
132        validateAndUpdateItemTotal: function (event) {
133            var parentLi = ACC.quickorder.getCurrentParentLi(event.target);
134            var qtyValue = jQuery.trim(ACC.productorderform.filterSkuEntry($(event.target).val()));
135            if (isNaN(qtyValue) || qtyValue == "") {
136                qtyValue = 0;
137                $(event.target).removeClass(ACC.quickorder.$classHasError);
138                ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyValidationContainer).text('');
139                $(event.target).val(0);
140            }
141            else {
142                qtyValue = Number(qtyValue);
143                $(event.target).val(qtyValue);
144                var maxQty = jQuery.trim(ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyInputField).data('maxProductQty'));
145                var stockLevelStatus = jQuery.trim(ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyInputField).data('stockLevelStatus'));
146                maxQty = ($.isEmptyObject(maxQty) && stockLevelStatus == "inStock") ? "FORCE_IN_STOCK" : Number(maxQty);
147                if (!isNaN(maxQty) && qtyValue > maxQty) {
148                    $(event.target).addClass(ACC.quickorder.$classHasError);
149                    var qtyValidationContainer = ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyValidationContainer);
150                    qtyValidationContainer.text(qtyValidationContainer.data('maxProductQtyMsg'));
151                    qtyValue = maxQty;
152                    $(event.target).val(maxQty);
153                }
154                else {
155                    $(event.target).removeClass(ACC.quickorder.$classHasError);
156                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyValidationContainer).text('');
157                }
158            }
159
160            if (qtyValue > 0) {
161                var itemPrice = parseFloat(ACC.quickorder.findElement(parentLi, '.js-product-price').data('productPrice'));
162                ACC.quickorder.findElement(parentLi, ACC.quickorder.$productItemTotal)
163                    .html(ACC.productorderform.formatTotalsCurrency(itemPrice * qtyValue));
164            }
165            else {
166                ACC.quickorder.findElement(parentLi, ACC.quickorder.$productItemTotal).text('');
167            }
168        },
169
170        clearQuickOrderRow: function () {
171            var quickOrderMinRows = ACC.quickorder.$quickOrderMinRows;
172            var parentLi = ACC.quickorder.getCurrentParentLi(this);
173            if ($('.js-ul-container li.js-li-container').length > quickOrderMinRows) {
174                parentLi.remove();
175                ACC.quickorder.bindClearQuickOrderRow();
176            }
177            else {
178                ACC.quickorder.findElement(parentLi, ACC.quickorder.$productInfoContainer).remove();
179                ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).css('margin-left', '0px').text('');
180                ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuInputField).val('');
181                ACC.quickorder.findElement(parentLi, ACC.quickorder.$hiddenSkuInput).val('');
182            }
183            ACC.quickorder.enableDisableAddToCartBtn();
184            ACC.quickorder.handleBeforeUnloadEvent();
185        },
186
187        addInputRow: function (event) {
188
189            if ($('.js-quick-order-container li.js-li-container:last-child').find(ACC.quickorder.$skuInputField).is($(event.target)) &&
190                $(ACC.quickorder.$jsLiContainer).length < ACC.quickorder.$quickOrderMaxRows) {
191                var liClone = $('.js-quick-order-container li.js-li-container:first').clone();
192                ACC.quickorder.findElement(liClone, ACC.quickorder.$productInfoContainer).remove();
193                ACC.quickorder.findElement(liClone, ACC.quickorder.$skuValidationContainer).css('margin-left', '0px').text('');
194                ACC.quickorder.findElement(liClone, ACC.quickorder.$hiddenSkuInput).val('');
195                var currentSkuInputField = ACC.quickorder.findElement(liClone, ACC.quickorder.$skuInputField);
196                currentSkuInputField.val('');
197                currentSkuInputField.focusin(ACC.quickorder.addInputRow).focusout(ACC.quickorder.handleFocusOutOnSkuInput).keydown(ACC.quickorder.handleFocusOutOnSkuInput);
198                ACC.quickorder.findElement(liClone, ACC.quickorder.$removeQuickOrderRowBtn).click(ACC.quickorder.clearQuickOrderRow);
199                $('.js-ul-container').append(liClone);
200            }
201        },
202
203        handleGetProduct: function (event) {
204            var parentLi = ACC.quickorder.getCurrentParentLi(event.target);
205            var productCode = $.trim(event.target.value);
206            $(event.target).val(productCode);
207            if (!ACC.quickorder.isCurrentSkuSameAsPrevious(parentLi, productCode)) {
208                if (productCode.length > 0) {
209                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$productInfoContainer).remove();
210
211                    if (ACC.quickorder.isDuplicateSku(event.target, productCode)) {
212                        ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer)
213    					.css('margin-left', '15px')
214    					.text(ACC.quickorder.$productExistsInFormMsg);
215                    }
216                    else {
217                        ACC.quickorder.getAndDisplayProductInfo(event, parentLi, productCode);
218                    }
219                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$hiddenSkuInput).val(productCode);
220                }
221                else {
222                    $(event.target).removeClass(ACC.quickorder.$classHasError);
223                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer).css('margin-left', '15px').text('');
224                    ACC.quickorder.findElement(parentLi, ACC.quickorder.$productInfoContainer).remove();
225                }
226            }
227        },
228
229        isCurrentSkuSameAsPrevious: function (parentLi, productCode) {
230            return ACC.quickorder.findElement(parentLi, ACC.quickorder.$hiddenSkuInput).val() == productCode;
231        },
232
233        isDuplicateSku: function (currentInput, productCode) {
234            var exists = false;
235            $(ACC.quickorder.$skuInputField).each(function () {
236                if ($(this).val() == productCode && !$(this).is($(currentInput))) {
237                    exists = true;
238                    return false
239                }
240            });
241            return exists;
242        },
243
244        getAndDisplayProductInfo: function (event, parentLi, productCode) {
245            var url = ACC.config.encodedContextPath + '/quickOrder/productInfo?code=' + productCode;
246            ACC.quickorder.findElement(parentLi, '.quickorder-loading').removeClass('hidden');
247            $.getJSON(url)
248                 .done(function (result) {
249                     if (result.errorMsg != null && result.errorMsg.length > 0) {
250                         $(event.target).addClass(ACC.quickorder.$classHasError);
251                         ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer)
252                              .css('margin-left', '15px')
253                              .text(result.errorMsg);
254                     } else {
255                         $(event.target).removeClass(ACC.quickorder.$classHasError);
256                         ACC.quickorder.findElement(parentLi, ACC.quickorder.$skuValidationContainer)
257                              .css('margin-left', '0px')
258                              .text('');
259                         $('#quickOrderRowTemplate').tmpl(result.productData)
260                              .insertAfter(ACC.quickorder.findElement(parentLi, '.js-sku-container'));
261                         if ($('.item__list--item .item__pvp').length < 1) {
262                             $('.item__list--item').addClass('noPvp');
263                         }
264                         var qtyInputField = ACC.quickorder.findElement(parentLi, ACC.quickorder.$qtyInputField);
265                         var stockVisible = ACC.quickorder.findElement(parentLi, ACC.quickorder.$stockVisible);
266                         qtyInputField
267                             .focusout(ACC.quickorder.handleFocusOutOnQtyInput)
268                             .keydown(ACC.quickorder.handleFocusOutOnQtyInput);
269                         var stockLevelStatus = result.productData.stock.stockLevelStatus.code;
270                         if (stockLevelStatus == "outOfStock") {
271                             qtyInputField.val(0);
272                             qtyInputField.prop('disabled', true);
273                             stockVisible.css("display", "block");
274                         } else {
275                             qtyInputField.focus().select();
276                         }
277                         ACC.quickorder.enableDisableAddToCartBtn();
278                     }
279                 })
280                 .fail(function () {
281                     console.error('Error al cargar la información del producto');
282                 })
283                 .always(function () {
284                     ACC.quickorder.findElement(parentLi, '.quickorder-loading').addClass('hidden');
285                 });
286
287        },
288
289        handleBeforeUnloadEvent: function () {
290            if (ACC.quickorder.isAnySkuPresent()) {
291                ACC.quickorder.disableBeforeUnloadEvent();
292                ACC.quickorder.enableBeforeUnloadEvent();
293            }
294            else {
295                ACC.quickorder.disableBeforeUnloadEvent();
296            }
297        },
298
299        disableBeforeUnloadEvent: function () {
300            $(window).off('beforeunload', ACC.quickorder.beforeUnloadHandler);
301        },
302
303        enableBeforeUnloadEvent: function () {
304            $(window).on('beforeunload', ACC.quickorder.beforeUnloadHandler);
305        },
306
307        beforeUnloadHandler: function () {
308            return ACC.quickorder.$quickOrderLeavePageMsg;
309        },
310
311        enableDisableAddToCartBtn: function () {
312            var addToCartButtonEnabled = ACC.quickorder.shouldAddToCartBeEnabled();
313
314            // if there are no items to add, disable addToCartBtn, otherwise, enable it
315            if (addToCartButtonEnabled) {
316                ACC.quickorder.$addToCartBtn.removeAttr('disabled');
317            } else {
318                ACC.quickorder.$addToCartBtn.attr('disabled', 'disabled');
319            }
320        },
321
322        shouldAddToCartBeEnabled: function () {
323            var sum = 0;
324            var enable = false;
325            $(ACC.quickorder.$qtyInputField).each(function () {
326                var str = this.value.trim();  // .trim() may need a shim
327                if (str) {   // don't send blank values to `parseInt`
328                    sum += parseInt(str, 10);
329                }
330                if (sum >= 1) {
331                    enable = true;
332                    return false;
333                }
334            });
335            return enable;
336        },
337
338        isAnySkuPresent: function () {
339            var present = false;
340            $(ACC.quickorder.$skuInputField).each(function () {
341                var str = jQuery.trim(this.value);  // .trim() may need a shim
342                if (str) {
343                    present = true;
344                    return false;
345                }
346            });
347            return present;
348        },
349
350        getCurrentParentLi: function (currentElement) {
351            return $(currentElement).closest(ACC.quickorder.$jsLiContainer);
352        },
353
354        findElement: function (currentElement, toFind) {
355            return $(currentElement).find(toFind);
356        },
357
358        findElementInCurrentParentLi: function (currentElement, toFind) {
359            return $(currentElement).closest(ACC.quickorder.$jsLiContainer).find(toFind);
360        }
361    };
362}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.