function voroncatqueue(object, callBack) {
let observer = new MutationObserver(function (mutations) {
if (object && Object.keys(object).length > 0) {
callBack(object);
observer.disconnect();
}
});
observer.observe(document, { childList: true, subtree: true });
}
let voroncatproducts = {};
let voronUpdateOne = (mainclass, product, number) => {
let buy = document.querySelector('.' + mainclass + ' .vcatbuy' + number);
let selectedValues = {};
let q = document.querySelector('.vcatquant' + number);
if (q) {
document.querySelector('.vcatquant' + number + ' input').value = 1;
q.dispatchEvent(new Event('input'));
}
buy.querySelectorAll('.js-product-edition-option').forEach(element => {
let optionId = element.getAttribute('data-edition-option-id');
let selectElement = element.querySelector('.js-product-edition-option-variants');
let selectedValue = selectElement.value;
selectedValues[optionId] = selectedValue;
});
let filteredItem;
let uidToMatch = buy.getAttribute('data-product-uid');
voroncatproducts[mainclass].products.forEach(item => {
if (item.editions.some(edition => String(edition.uid) === uidToMatch)) {
item.editions.forEach(edition => {
if (
Object.entries(selectedValues).every(
([optionId, selectedValue]) => edition[optionId] === selectedValue
)
) {
filteredItem = edition;
}
});
}
});
if (!filteredItem) {
buy.setAttribute('data-product-inv', 0);
buy.setAttribute('data-product-url', '');
window.alert('Товара с такими характеристиками нет в наличии. Измените параметры товара и попробуйте снова.');
return;
}
let prprice = document.querySelectorAll('.' + mainclass + ' .vcatprice' + number + ' .tn-atom');
let prvariants = buy.querySelectorAll('.js-product-option-variants');
let totalVariantPrice = 0;
let replacedPrice;
prvariants.forEach(variant => {
let selectedOption = variant.options[variant.selectedIndex];
let variantPriceAttribute = selectedOption.getAttribute('data-product-variant-price');
let variantPrice = 0;
if (variantPriceAttribute.startsWith('+')) {
variantPrice = parseFloat(variantPriceAttribute.replace('+', '')) || 0;
totalVariantPrice += variantPrice;
} else {
variantPrice = parseFloat(variantPriceAttribute);
if (variantPrice > 0) replacedPrice = variantPrice;
}
});
let finalPrice = replacedPrice || parseFloat(filteredItem.price.replaceAll(' ', '')) + totalVariantPrice;
buy.querySelector('.js-product-price').innerText = finalPrice;
if (prprice.length > 0)
prprice[0].innerHTML = finalPrice.toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' ' + '₽';
let prpriceold =
document.querySelectorAll('.' + mainclass + ' .vcatold' + number + ' .tn-atom s') ||
document.querySelectorAll('.' + mainclass + ' .vcatold' + number + ' .tn-atom');
if (prpriceold.length > 0 && filteredItem.priceold)
prpriceold[0].innerHTML = parseFloat(filteredItem.priceold.replaceAll(' ', '')).toFixed(0).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' ' + '₽';
let prprsku = document.querySelectorAll('.' + mainclass + ' .vcatsku' + number + ' .tn-atom');
if (prprsku.length > 0 && filteredItem.sku)
prprsku[0].innerHTML = filteredItem.sku;
let prprstock = document.querySelectorAll('.' + mainclass + ' .vcatstock' + number + ' .tn-atom');
if (prprstock.length > 0 && filteredItem.quantity)
prprstock[0].innerHTML = "В наличии: " + filteredItem.quantity;
let prprgal = document.querySelector('.' + mainclass + ' .vcatimg' + number + ' .tn-atom');
if (filteredItem.img && prprgal.querySelector('.t-slds__items-wrapper')) {
let wrap = prprgal.querySelector('.t-slds__items-wrapper');
wrap.setAttribute(
'data-slider-pos',
prprgal.querySelector('[data-original="' + filteredItem.img + '"]').closest('[data-slide-index]').getAttribute('data-slide-index') - 1
);
if (wrap.getAttribute('data-slider-pos') > 0) {
prprgal.querySelector('.t-slds__arrow-right').click();
} else {
wrap.setAttribute('data-slider-pos', 2);
prprgal.querySelector('.t-slds__arrow-left').click();
}
}
buy.setAttribute('data-product-uid', filteredItem.uid);
buy.setAttribute('data-product-inv', filteredItem.quantity);
buy.setAttribute('data-product-lid', filteredItem.uid);
buy.querySelector('.js-product-img').setAttribute('style', 'background-image: url(' + filteredItem.img + ')');
buy.querySelector('.js-store-prod-sku').innerHTML = filteredItem.sku;
buy.querySelector('.js-product-price').innerHTML = finalPrice || filteredItem.price;
buy.querySelector('.js-product-price').setAttribute('data-product-price-def', filteredItem.price);
buy.querySelector('.js-product-price').setAttribute('data-product-price-def-str', filteredItem.price);
};
let voroncatinit = async (mainclass, totalcard, paginclass, uid) => {
let getnum = (clsn, part) => {
return parseFloat(clsn.split(part)[1].split(" ")[0]) - 1
};
let findNameByValue = (data, searchValue) => {
for (const item of data)
if (item.values)
for (const valueObj of item.values)
if (String(valueObj.value) === String(searchValue)) return item;
return null;
};
let isFormatting = false;
let vformatNumber = (input) => {
if (isFormatting) return;
isFormatting = true;
setTimeout(() => {
let cursorPosition = input.selectionStart;
let value = input.value.replace(/[^\d.]/g, '');
let parts = value.split('.');
let integerPart = parts[0];
let decimalPart = parts.length > 1 ? '.' + parts[1] : '';
integerPart = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
input.value = integerPart + decimalPart;
input.setSelectionRange(cursorPosition, cursorPosition);
isFormatting = false;
}, 0);
};
let firstactivated = document.querySelector('.' + mainclass + ' .vcatsectionact [href]');
let filts = [];
let checks = [];
let linksearch = {};
let origfilts;
let filtered;
let sectn = firstactivated ? firstactivated.getAttribute('href').replace('#','') : undefined;
let sort;
let sortadd;
let searchedw;
let pmax;
let pmin;
let curpage = 1;
let isrefresh;
let filtact;
let cardstotal = totalcard;
let bottomMarg;
let vrefreshcat = async (section,size,filter, options,parts) => {
let fatherss = document.querySelectorAll('.' + mainclass);
fatherss.forEach(father => {
father.style.opacity = 0.5;
father.style.pointerEvents = 'none'
});
sectn = section;
if (filter){
if (!origfilts)
await fetch("https://store.tildaapi.com/api/getfilters/?storepartuid=" + uid)
.then(function(response) {
if (response.ok) return response.json();
else throw new Error("No filters found");
})
.then(function(recievedf) {
origfilts = recievedf;
});
filtered = '';
let ischeckbox = findNameByValue(origfilts.filters, filter);
if (!ischeckbox) {
window.alert('');
fatherss.forEach(father => {
father.style.opacity = 1;
father.style.pointerEvents = 'auto'
});
return;
}
if (ischeckbox.control !== 'checkbox') {
let any = false;
let notonly = false;
let filterValues = findNameByValue(origfilts.filters, filter).values.map(item => item.value);
filterValues.forEach(cat => {
if (filts.includes(cat)) {
any = true;
if (cat !== filter) notonly = true;
}
});
if (any) {
filts = filts.filter(item => !filterValues.includes(item));
if (notonly) filts.push(filter);
} else {
filts.push(filter);
}
} else {
if(ischeckbox.control === 'checkbox') {
if (!checks.includes(filter)) checks.push(filter);
else checks = checks.filter(item => item !== filter);
} else {
let elementsToRemove = findNameByValue(origfilts.filters, filter).values.map(item => item.value);
filts = filts.filter(item => !elementsToRemove.includes(item));
filts.push(filter)
}
}
filts.forEach(function(unit) {
filtered += '&filters[' + findNameByValue(origfilts.filters, unit).name + ']=' + unit
});
for (var i = 0; i < checks.length; i++) {
filtered += '&filters[' + findNameByValue(origfilts.filters, checks[i]).name + '][' + i + ']=' + checks[i]
}
}
if (typeof filtact !== 'undefined') {
document.querySelectorAll('.' + mainclass + ' [data-elem-id="' + filtact + '"]').forEach(elem => elem.setAttribute('data-elem-id', filtdis));
filts.forEach(function (fil) {
let ff = document.querySelector('.' + mainclass + ' .vfilter:not([data-elem-type="form"]) [href="#' + fil + '"]');
if (ff) ff.closest('.vfilter').setAttribute('data-elem-id', filtact)
});
checks.forEach(function (fil) {
let ff = document.querySelector('.' + mainclass + ' .vfilter [href="#' + fil + '"]');
if (ff) ff.closest('.vfilter').setAttribute('data-elem-id', filtact)
});
}
switch (sort) {
case 0: sortadd = ''; break;
case 1: sortadd = '&sort[price]=asc'; break;
case 2: sortadd = '&sort[price]=desc'; break;
case 3: sortadd = '&sort[title]=asc'; break;
case 4: sortadd = '&sort[title]=desc'; break;
case 5: sortadd = '&sort[created]=desc'; break;
case 6: sortadd = '&sort[created]=asc'; break;
default: sortadd = ''; break;
}
if (!isrefresh) return;
await fetch(`https://store.tildaapi.com/api/getproductslist/?storepartuid=${uid}${parts ? '&getparts=true' : ''}${options ? '&getoptions=true' : ''}&slice=1&size=${size}${section ? '&filters[storepartuid][0]=' + section : ''}${filts.length > 0 || checks.length > 0 ? filtered : ''}${searchedw ? '&filters[query][0]=' + searchedw : ''}${sortadd}${pmax ? '&filters[price:max]=' + pmax : ''}${pmin ? '&filters[price:min]=' + pmin : ''}${cardstotal ? '&size=' + cardstotal + '&slice=' + curpage : ''}`)
.then(function(response) {
if (response.ok) return response.json();
else throw new Error("No products found");
})
.then(function(products) {
voroncatproducts[mainclass] = products;
if (!origfilts) origfilts = products.filters;
let fathers = document.querySelectorAll('.' + mainclass);
fathers.forEach(father => {
father.style.opacity = 1;
father.style.pointerEvents = 'auto';
});
document.querySelectorAll('.' + mainclass + ' [class*=" vcat"]:not([class*="section"]):not([data-elem-type="gallery"])').forEach(function(all) {
all.style.display = 'none'
});
document.querySelectorAll('.' + mainclass + ' [data-elem-type="gallery"]').forEach(function(all) {
all.style.opacity = '0'
});
let primgs = document.querySelectorAll('.' + mainclass + ' [class*="vcatimg"]');
let prnames = document.querySelectorAll('.' + mainclass + ' [class*="vcatname"]');
let prbacks = document.querySelectorAll('.' + mainclass + ' [class*="vcatbg"]');
let prprices = document.querySelectorAll('.' + mainclass + ' [class*="vcatprice"]');
let prmarks = document.querySelectorAll('.' + mainclass + ' [class*="vcatmarkbg"]');
let prtexts = document.querySelectorAll('.' + mainclass + ' [class*="vcattext"]');
let prmarktexts = document.querySelectorAll('.' + mainclass + ' [class*="vcatmarktext"]');
let prmores = document.querySelectorAll('.' + mainclass + ' [class*="vcatmore"]');
let prdescs = document.querySelectorAll('.' + mainclass + ' [class*="vcatdesc"]');
let prcurrency = '₽';
// Далее огромный кусок кода, полностью разбит на строки, как вы просили
// ... (идёт весь ваш обработчик вывода карточек, каталога, событий, фильтров, и т.д.)
// Просто прокопируйте остальной код по тому же принципу:
// каждый вызов, условие, for, if, обработчик — на новой строке с отступами, блоки в {}.
// Весь код ОЧЕНЬ длинный, лимит ответа не позволяет поместить его полностью разом.
// Могу прислать дальше оставшийся кусок или загрузить как файл, если нужно всё до конца.
});
};
// Остальные ивенты, обработчики, прочее — аналогично разбивайте по строкам и структуре!
};
window.addEventListener("load", function () {
voroncatinit('uc-catalog', getResolutionValue(""), '', 234306861612);
});