PageSourceSearch

https://xn--80akjfhmgn4l.market/scripts/_partials/catalog-filter/services/catalogFilterService.js

js xn--80akjfhmgn4l.market collected 2026-10-09 21:31:26 UTC 24,047 bytes, 637 lines download raw bytes

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.