PageSourceSearch

https://webshop.koenig-bauer.com/shop/_ui/responsive/common/js/acc.quickorder.js

js koenig-bauer.com collected 2026-10-01 12:19:10 UTC 19,026 bytes, 397 lines download raw bytes

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

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.