This commit is contained in:
2026-04-06 18:44:02 +05:00
commit d775fbb9ba
431 changed files with 31234 additions and 0 deletions

View File

@@ -0,0 +1,126 @@
// Универсальный AJAX для добавления в корзину
document.addEventListener('DOMContentLoaded', function () {
const cartForms = document.querySelectorAll('form[action*="cart/add"]');
cartForms.forEach(form => {
form.addEventListener('submit', async function (e) {
e.preventDefault();
const submitBtn = this.querySelector('button[type="submit"]');
if (!submitBtn) return;
const originalText = submitBtn.textContent;
submitBtn.disabled = true;
submitBtn.textContent = 'Добавление...';
// Получаем данные формы
const variationId = this.querySelector('input[name="variation_id"]')?.value;
const quantity = this.querySelector('input[name="quantity"]')?.value || 1;
try {
const response = await fetch(this.action, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
body: JSON.stringify({
variation_id: variationId,
quantity: quantity
})
});
// Проверяем, что ответ JSON
const contentType = response.headers.get('content-type');
if (!contentType || !contentType.includes('application/json')) {
throw new Error('Сервер вернул HTML вместо JSON');
}
const data = await response.json();
if (data.success) {
// Обновляем счетчик корзины
const cartCountElements = document.querySelectorAll('.cart-count');
cartCountElements.forEach(el => {
el.textContent = data.cart_count;
el.classList.add('cart-bump');
setTimeout(() => el.classList.remove('cart-bump'), 300);
});
submitBtn.textContent = '✓ Добавлено';
showNotification(data.message, 'success');
setTimeout(() => {
submitBtn.textContent = originalText;
submitBtn.disabled = false;
}, 1500);
} else {
showNotification(data.message || 'Ошибка', 'error');
submitBtn.textContent = originalText;
submitBtn.disabled = false;
}
} catch (error) {
console.error('Error:', error);
showNotification('Ошибка при добавлении в корзину', 'error');
submitBtn.textContent = originalText;
submitBtn.disabled = false;
}
});
});
function showNotification(message, type = 'success') {
const oldNotification = document.querySelector('.notification');
if (oldNotification) oldNotification.remove();
const notification = document.createElement('div');
notification.className = `notification notification-${type}`;
notification.textContent = message;
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: ${type === 'success' ? '#2c5e2e' : '#dc3545'};
color: white;
padding: 12px 24px;
border-radius: 8px;
z-index: 9999;
animation: slideIn 0.3s ease;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
`;
document.body.appendChild(notification);
setTimeout(() => {
notification.style.animation = 'slideOut 0.3s ease';
setTimeout(() => notification.remove(), 300);
}, 3000);
}
// Добавляем CSS анимации
if (!document.querySelector('#cart-animations')) {
const style = document.createElement('style');
style.id = 'cart-animations';
style.textContent = `
@keyframes slideIn {
from { transform: translateX(100%); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes slideOut {
from { transform: translateX(0); opacity: 1; }
to { transform: translateX(100%); opacity: 0; }
}
@keyframes cartBump {
0% { transform: scale(1); }
50% { transform: scale(1.2); }
100% { transform: scale(1); }
}
.cart-bump {
animation: cartBump 0.3s ease;
display: inline-block;
}
`;
document.head.appendChild(style);
}
});