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.