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.