1; (function (ng) { 2 3 'use strict'; 4 5 var catalogFilterService = function () { 6 7 var service = this, 8 filterStorage, storedFilters; 9 10 11 12 13 service.buildUrl = function (filterSelectedItems) { 14 var result = [], obj; 15 //debugger; 16 for (var item in filterSelectedItems) { 17 //debugger; 18 if (ng.isArray(filterSelectedItems[item]) === true) { 19 obj = item + '=' + filterSelectedItems[item].map(function (val) { 20 return ng.isArray(val) ? val.join(',') : val; 21 }).join('-'); 22 } else { 23 obj = item + '=' + filterSelectedItems[item]; 24 } 25 26 result.push(obj); 27 } 28 29 return result.join('&'); 30 }; 31 32 service.getSelectedData = function (filterData, isSeoPlusMode, selectedValue, isSelected) { 33 //debugger; 34 if (filterData == null) { 35 return null; 36 } 37 //debugger; 38 var arraySelected, 39 selectedItems, 40 item, 41 nameRangeMin, nameRangeMax; 42 43 for (var i = filterData.length - 1; i >= 0; i--) { 44 45 item = filterData[i]; 46 47 if (item == null) 48 continue; 49 50 //ISVR: Custom code starts 51 //debugger; 52 if ((isSeoPlusMode != null) && (selectedValue != null) && (isSelected != null)) { 53 if (isSeoPlusMode) { 54 if (item.Values.filter(function (x) { return x.Id == selectedValue; }).length > 0) { 55 ng.forEach(item.Values, function (arrItem) { 56 if (arrItem.Id != selectedValue) { 57 arrItem.Selected = false; 58 arrItem.IsLocked = isSelected ? true : false; 59 } 60 else { 61 arrItem.Selected = isSelected; 62 arrItem.IsLocked = false; 63 } 64 }); 65 } 66 } 67 } 68 //ISVR: Custom code ends 69 70 //иÑем вÑбÑаннÑе знаÑÐµÐ½Ð¸Ñ 71 if (item.Control == 'select' || item.Control == 'selectSearch') { 72 if (item.Selected != null && item.Selected.Id !== '0') { 73 selectedItems = item.Selected.Id; 74 } 75 } 76 else { 77 selectedItems = item.Values.filter(function (item) { return item.Selected }).map(function (item) { return item.Id; }); 78 } 79 80 //добавлÑем ÑÑи знаÑÐµÐ½Ð¸Ñ Ð² маÑÑив 81 if (selectedItems != null && selectedItems.length > 0) { 82 83 arraySelected = arraySelected || {}; 84 85 arraySelected[item.Type] = arraySelected[item.Type] || []; 86 87 arraySelected[item.Type].push(selectedItems); 88 } 89 90 //добавлÑем ÑекÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка 91 if (item.Control == 'input' && item.Text.length > 0) { 92 arraySelected = arraySelected || {}; 93 arraySelected["q"] = [item.Text]; 94 } 95 96 //добавлÑем знаÑÐµÐ½Ð¸Ñ Ð¸Ð· ползÑнков 97 if (item.Control == 'range') { 98 arraySelected = arraySelected || {}; 99 100 if (item.Type == 'price') { 101 nameRangeMin = 'pricefrom'; 102 nameRangeMax = 'priceto'; 103 } else { 104 nameRangeMin = item.Type + '_' + item.Values[0].Id + '_min'; 105 nameRangeMax = item.Type + '_' + item.Values[0].Id + '_max'; 106 } 107 108 if (item.Values[0].Min !== item.Values[0].CurrentMin || item.Values[0].Max !== item.Values[0].CurrentMax) { 109 arraySelected[nameRangeMin] = [item.Values[0].CurrentMin]; 110 arraySelected[nameRangeMax] = [item.Values[0].CurrentMax]; 111 } 112 } 113 } 114 115 return arraySelected; 116 }; 117 118 //ISVR: Custom code starts 119 service.HasStandardFiltersSelected = function (filterData) { 120 var result = false; 121 if (filterData == null) { 122 return result; 123 } 124 125 for (var item in filterData) { 126 //debugger; 127 if (ng.isArray(filterData[item]) !== true) { 128 if (filterData[item].hasOwnProperty("Values")) { 129 if (ng.isArray(filterData[item].Values)) { 130 for (var subItemIndex = 0; subItemIndex < filterData[item].Values.length; subItemIndex++) { 131 if ((filterData[item].Values[subItemIndex].hasOwnProperty("CurrentMin")) && 132 (filterData[item].Values[subItemIndex].hasOwnProperty("CurrentMax")) && 133 (filterData[item].Values[subItemIndex].hasOwnProperty("Min")) && 134 (filterData[item].Values[subItemIndex].hasOwnProperty("Max"))) { 135 136 if ((filterData[item].Values[subItemIndex].CurrentMin != filterData[item].Values[subItemIndex].Min) 137 || (filterData[item].Values[subItemIndex].CurrentMax != filterData[item].Values[subItemIndex].Max)) { 138 result = true; 139 break; 140 } 141 } 142 else if ((filterData[item].Values[subItemIndex].hasOwnProperty("Selected")) && 143 (filterData[item].Values[subItemIndex].hasOwnProperty("UrlSynonim"))) { 144 if (filterData[item].Values[subItemIndex].Selected === true) { 145 if (filterData[item].Values[subItemIndex].UrlSynonim == '') { 146 result = true; 147 break; 148 } 149 } 150 } 151 } 152 } 153 } 154 } 155 } 156 157 return result; 158 }; 159 160 service.GetOldStyleUrl = function (currentLocationData, selectedItems) { 161 //debugger; 162 var portNumber = ((currentLocationData.port == 80) || (currentLocationData.port == 443)) ? '/' : (":" + currentLocationData.port + '/'); 163 var params = currentLocationData.pathname.split('/'); 164 selectedItems = selectedItems || {}; 165 166 if (params.length > 0) { 167 if (params[0] == '') { 168 params.splice(0, 1); 169 } 170 } 171 172 if ((params.length > 1) && (Object.keys(selectedItems).length > 0)) { 173 return currentLocationData.protocol + "//" + currentLocationData.hostname + portNumber + params[0] + "/" + params[1] + '?' + service.buildUrl(selectedItems); 174 } 175 else { 176 return currentLocationData.protocol + "//" + currentLocationData.hostname + portNumber; 177 } 178 }; 179 //ISVR: Custom code ends 180 181 service.parseSearchString = function (str) { 182 //debugger; 183 var index = str.indexOf('?'), 184 strNormalize = str, 185 parameters = {}, 186 arrayKeyValues, 187 temp; 188 189 if (index > -1) { 190 strNormalize = strNormalize.substring(index + 1); 191 } 192 193 arrayKeyValues = strNormalize.split('&'); 194 195 for (var i = arrayKeyValues.length - 1; i >= 0; i--) { 196 temp = arrayKeyValues[i].split('='); 197 198 if (temp.length === 2) { 199 parameters[decodeURIComponent(temp[0])] = decodeURIComponent(temp[1]); 200 } 201 } 202 203 return parameters; 204 }; 205 206 //ISVR: Custom code starts 207 service.parseSearchAdvancedString = function (str) { 208 //debugger; 209 let parameters = {}; 210 211 if (str.length == 1) return parameters; 212 213 if (str.substring(0, 1) == '/') str = str.substring(1); 214 215 var parts = str.split("/"); 216 var startIndex = 0; 217 218 if (parts.Length == startIndex) return parameters; 219 220 if (parts[startIndex].toLowerCase() == "categories") startIndex += 1;
221 222 if (parts.Length <= startIndex) return parameters; 223 224 parameters["Url"] = str; 225 226 return parameters; 227 }; 228 229 //ISVR: Custom code starts 230 service.getFilterDataById = function (filterId) { 231 //debugger; 232 233 let keys = Object.keys(storedFilters || {}); 234 235 // ÐÑовеÑÑем гÑаниÑÑ 236 if (typeof filterId !== 'number' || filterId < 0 || filterId >= keys.length) { 237 return null; 238 } 239 240 // ÐолÑÑаем нÑжнÑй клÑÑ 241 let key = keys[filterId]; 242 243 // ÐозвÑаÑаем знаÑение по клÑÑÑ 244 return key ?? null; 245 }; 246 247 service.parseFiltersFromUrlPart = function (parts, filterUrlPart, startIndex) { 248 let filters = []; 249 let parsedRawFilterName = ''; 250 let parsedRawFilterValue = ''; 251 let macrosIndex = filterUrlPart.indexOf("]]") > -1 ? filterUrlPart.indexOf("]]") + 2 : -1; 252 let tmpNewFilter = macrosIndex > -1 ? filterUrlPart.substring(macrosIndex) : filterUrlPart; 253 let arrIndexRawData = macrosIndex > -1 ? filterUrlPart.substring(0, macrosIndex) : "100"; 254 let newFilterAdded = false; 255 let result = ''; 256 257 //debugger; 258 259 var newFilterIndex = arrIndexRawData.replace(/\D+?/g, ''); 260 261 for (var i = startIndex; i < parts.length; i++) { 262 //debugger; 263 if ((i % 2) == 0) { 264 parsedRawFilterName = parts[i]; 265 } 266 else { 267 parsedRawFilterValue = parts[i]; 268 } 269 270 if ((parsedRawFilterName != '') && (parsedRawFilterValue != '')) { 271 //debugger; 272 if (filters.length + 1 == newFilterIndex) { 273 filters.push(tmpNewFilter); 274 newFilterAdded = true; 275 //break; 276 } 277 278 parsedRawFilterName = ''; 279 parsedRawFilterValue = ''; 280 } 281 } 282 283 if (!newFilterAdded) { 284 filters.push(tmpNewFilter); 285 } 286 287 for (var fi = 0; fi < filters.length; fi++) { 288 //debugger; 289 if (result.indexOf(filters[fi]) == -1) { 290 //IE & Opera issue 291 //result += (result.endsWith('/') ? '' : '/') + filters[fi]; 292 result += ((result).match(/\/$/) ? '' : '/') + filters[fi]; 293 } 294 } 295 296 return result; 297 }; 298 299 //service.transformUrl = function (currentUrl, filterUrlPart) { 300 // //debugger; 301 // let result = ''; 302 // if (currentUrl.length == 1) return ''; 303 304 // if (currentUrl.substring(0, 1) == '/') currentUrl = currentUrl.substring(1); 305 306 // let parts = currentUrl.split('/'); 307 // let startIndex = 0; 308 309 // if (parts.length == startIndex) 310 // return result; 311 312 // if (parts[startIndex].toLowerCase() == "categories") 313 // startIndex += 1;
314 315 // if (parts.length <= startIndex) 316 // return result; 317 318 // for (var partIndex = startIndex; partIndex < parts.length; partIndex++) { 319 // if (partIndex == startIndex) { 320 // result = parts[partIndex]; 321 // break; 322 // } 323 // } 324 325 // if (result.length > 0) { 326 // result += service.getMergedUrl((parts.length > startIndex + 1 ? parts.slice(startIndex + 1) : []), filterUrlPart, currentUrl); 327 // } 328 329 // //IE & Opera issue 330 // if ((startIndex == 1) && (!(result).match(/^categories\//))) { 331 // result = ('categories/' + result); 332 // } 333 334 // return result; 335 //}; 336 337 service.transformUrl = function (currentUrl, filterUrlPart) { 338 339 if (!currentUrl || currentUrl.length <= 1) return ''; 340 341 // УбиÑаем наÑалÑнÑй / 342 if (currentUrl.charCodeAt(0) === 47) { // бÑÑÑÑее Ñем substring + ÑÑавнение 343 currentUrl = currentUrl.slice(1); 344 } 345 346 var parts = currentUrl.split('/'); 347 var startIndex = 0; 348 349 if (!parts.length) return ''; 350 351 // ÐÑовеÑÑем "categories" без лиÑнего toLowerCase() 352 if (parts[0] && parts[0].toLowerCase() === 'categories') { 353 startIndex = 1; 354 } 355 356 if (parts.length <= startIndex) return ''; 357 358 // ÐмеÑÑо Ñикла ÑÑÐ°Ð·Ñ Ð±ÐµÑÑм нÑжнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ 359 var result = parts[startIndex]; 360 361 if (!result) return ''; 362 363 // ÐеÑж оÑÑавÑÐ¸Ñ ÑÑ ÑаÑÑей 364 if (parts.length > startIndex + 1) { 365 result += service.getMergedUrl( 366 parts.slice(startIndex + 1), 367 filterUrlPart, 368 currentUrl 369 ); 370 } else { 371 result += service.getMergedUrl([], filterUrlPart, currentUrl); 372 } 373 374 if (startIndex === 1 && result.indexOf('categories/') !== 0) { 375 result = 'categories/' + result; 376 } 377 378 return result; 379 }; 380 381 service.excludeFilterFromUrl = function (currentUrl, filterUrlPart) { 382 //debugger; 383 let result = ''; 384 if (currentUrl.length == 1) return ''; 385 386 if (currentUrl.substring(0, 1) == '/') currentUrl = currentUrl.substring(1); 387 388 let parts = currentUrl.split('/'); 389 let startIndex = 0; 390 391 if (parts.length == startIndex) 392 return result; 393 394 if (parts[startIndex].toLowerCase() == "categories") 395 startIndex += 1;
396 397 if (parts.length <= startIndex) 398 return result; 399 400 //debugger; 401 for (var partIndex = startIndex; partIndex < parts.length; partIndex++) { 402 if (partIndex == startIndex) { 403 result = parts[partIndex]; 404 break; 405 } 406 //else { 407 // if (result.length == 0) 408 // break; 409 410 //result += service.parseFiltersFromUrlPart(parts, filterUrlPart, startIndex + 1, isSelected); 411 //break; 412 //} 413 } 414 415 //debugger; 416 //if (startIndex + 1 == parts.length) { 417 418 // result += service.parseFiltersFromUrlPart(parts, filterUrlPart, startIndex + 1, isSelected); 419 //} 420 if (result.length > 0) { 421 //debugger; 422 result += service.getMergedUrl((parts.length > startIndex + 1 ? parts.slice(startIndex + 1) : []), filterUrlPart, currentUrl); 423 } 424 425 //IE & Opera issue 426 //if ((startIndex == 1) && (!result.startsWith('categories/'))) { 427 if ((startIndex == 1) && (!(result).match(/^categories\//))) { 428 result = ('categories/' + result); 429 } 430 //debugger; 431 return result; 432 }; 433 434 435 service.isTooLong = function (currentUrl) { 436 //debugger; 437 438 let result = ''; 439 if (currentUrl.length == 1) return ''; 440 441 if (currentUrl.substring(0, 1) == '/') currentUrl = currentUrl.substring(1); 442 443 let parts = currentUrl.split('/'); 444 let startIndex = 0; 445 446 if (parts.length == startIndex) 447 return result; 448 449 if (parts[startIndex].toLowerCase() == "categories") 450 startIndex += 1;
451 452 if (parts.length <= startIndex) 453 return result; 454 455 if (startIndex > 0) 456 parts.splice(0, startIndex + 1); 457 458 return (parts.length / 2) >= 3; 459 }; 460 461 462 //service.getMergedUrl = function (parts, filterToMerge, currentUrl) { 463 // let result = ''; 464 // let localParts = JSON.parse(JSON.stringify(parts)); 465 // let macrosIndex = filterToMerge.indexOf("]]") > -1 ? filterToMerge.indexOf("]]") + 2 : -1; 466 // let pureNewFilter = macrosIndex > -1 ? filterToMerge.substring(macrosIndex) : filterUrlPart; 467 468 // let arrNewFilter = pureNewFilter != '' ? pureNewFilter.split('/') : []; 469 // let soLong = service.isTooLong(currentUrl); 470 471 // let newFilterName = (arrNewFilter || []).length >= 0 ? arrNewFilter[0] : ""; 472 // let newFilterValue = (arrNewFilter || []).length >= 1 ? arrNewFilter[1] : ""; 473 // let resultFilters = []; 474 // let srcKeysLength = localParts.length / 2; 475 // let addedKeys = []; 476 477 // let keys = Object.keys(storedFilters || {}); 478 479 // if (soLong) 480 // if ($.inArray(newFilterName, localParts) === -1) { 481 // localParts.splice(-2, 2); 482 // } 483 484 // for (let availableKeyIndex = 0; availableKeyIndex < keys.length; availableKeyIndex++) { 485 // let existsIndex = $.inArray(keys[availableKeyIndex], localParts); 486 487 // if (keys[availableKeyIndex] === newFilterName) { 488 // if ($.inArray(newFilterName, resultFilters) === -1) { 489 // resultFilters.splice(availableKeyIndex, 0, [newFilterName, newFilterValue]); 490 // addedKeys.push(newFilterName); 491 492 // if (existsIndex > -1) { 493 // localParts.splice(existsIndex, 2); 494 // } 495 // } 496 // } 497 // else if (existsIndex > -1) { 498 // let currentKey = keys[availableKeyIndex] || ''; 499 // let currentValue = localParts[(existsIndex + 1)] || ''; 500 // if ($.inArray(currentKey, addedKeys) === -1) { 501 // if (currentKey !== newFilterName) { 502 // resultFilters.splice(availableKeyIndex, 0, [currentKey, currentValue]); 503 504 // addedKeys.push(currentKey); 505 // } 506 507 // localParts.splice(existsIndex, 2); 508 // } 509 // } 510 511 // if (addedKeys.length === (srcKeysLength === 3 ? srcKeysLength : srcKeysLength + 1)) 512 // break; 513 // } 514 515 // for (let partIndex = 0; partIndex < resultFilters.length; partIndex++) { 516 // result += '/' + resultFilters[partIndex].join('/'); 517 // } 518 519 // return result; 520 //}; 521 522 service.getMergedUrl = function (parts, filterToMerge, currentUrl) { 523 524 if (!parts || !parts.length) parts = []; 525 526 var result = ''; 527 528 var localParts = parts.slice(); 529 530 // ÐпÑимизиÑованное извлеÑение pureNewFilter 531 var macrosIndex = filterToMerge.indexOf(']]'); 532 var pureNewFilter = macrosIndex !== -1 533 ? filterToMerge.slice(macrosIndex + 2) 534 : filterToMerge; 535 536 var arrNewFilter = pureNewFilter ? pureNewFilter.split('/') : []; 537 538 var newFilterName = arrNewFilter[0] || ''; 539 var newFilterValue = arrNewFilter[1] || ''; 540 541 var soLong = service.isTooLong(currentUrl); 542 543 var keys = Object.keys(storedFilters || {}); 544 var resultFilters = []; 545 546 // ÐÑли URL ÑлиÑком длиннÑй 547 if (soLong && localParts.indexOf(newFilterName) === -1) { 548 localParts.splice(-2, 2); 549 } 550 551 // СоздаÑм Map ÑекÑÑÐ¸Ñ ÑилÑÑÑов (ÑÑкоÑÑÐµÑ Ð¿Ð¾Ð¸Ñк в 5â10 Ñаз) 552 var existingMap = {}; 553 for (var i = 0; i < localParts.length; i += 2) { 554 existingMap[localParts[i]] = localParts[i + 1];
555 } 556 557 for (var k = 0; k < keys.length; k++) { 558 559 var key = keys[k]; 560 561 if (key === newFilterName) { 562 resultFilters.push([newFilterName, newFilterValue]); 563 delete existingMap[key]; 564 } 565 else if (existingMap.hasOwnProperty(key)) { 566 resultFilters.push([key, existingMap[key]]); 567 delete existingMap[key]; 568 } 569 } 570 571 // ФоÑмиÑование ÑÑÑоки бÑÑÑÑее ÑеÑез маÑÑив + join 572 if (resultFilters.length) { 573 var segments = new Array(resultFilters.length); 574 for (var r = 0; r < resultFilters.length; r++) { 575 segments[r] = resultFilters[r].join('/'); 576 } 577 result = '/' + segments.join('/'); 578 } 579 580 return result; 581 }; 582 583 service.getBaseCategoryUrl = function (currentUrl) { 584 let result = ''; 585 586 if (currentUrl == null) return result + '/'; 587 if (currentUrl == '') return result + '/'; 588 589 currentUrl = currentUrl.substring(0, 1) == '/' ? currentUrl.substring(1) : currentUrl; 590 591 let parts = currentUrl.split('/'); 592 let startIndex = 0; 593 594 if (parts.length == startIndex) 595 return result; 596 597 if (parts[startIndex].toLowerCase() == "categories") 598 startIndex += 1;
599 600 if (parts.length <= startIndex) 601 return result; 602 603 for (var partIndex = startIndex; partIndex < parts.length; partIndex++) { 604 if (partIndex == startIndex) { 605 result += 'categories/' + parts[partIndex]; 606 break; 607 } 608 } 609 610 return result; 611 }; 612 613 service.storeFilters = function (filt) { 614 storedFilters = filt; 615 }; 616 617 service.getStoredFilters = function () { 618 return storedFilters; 619 }; 620 621 //ISVR: Custom code ends 622 623 service.saveFilterData = function (filter) { 624 filterStorage = filter; 625 }; 626 627 service.getFilterData = function () { 628 return filterStorage; 629 }; 630 }; 631 632 ng.module('catalogFilter') 633 .service('catalogFilterService', catalogFilterService); 634 635 catalogFilterService.$inject = []; 636 637})(window.angular);
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.