-
@@ -1167,80 +1172,6 @@ document.addEventListener('DOMContentLoaded', function() {
});
-
@@ -1923,12 +1854,12 @@ document.addEventListener('DOMContentLoaded', function() {
return;
}
- if (typeof window.initProductSelect2 !== 'function') {
- console.log('[Order Items] Ожидание загрузки initProductSelect2 из select2-product-search.js...');
+ if (typeof window.initOrderItemSelect2 !== 'function') {
+ console.log('[Order Items] Ожидание загрузки initOrderItemSelect2 из select2-product-search.js...');
setTimeout(initExistingOrderItems, 100);
return;
}
-
+
// Все зависимости готовы
console.log('[Order Items] Все зависимости готовы, запуск инициализации...');
const items = document.querySelectorAll('.select2-order-item');
diff --git a/myproject/products/static/products/js/select2-product-search.js b/myproject/products/static/products/js/select2-product-search.js
index a3ab73c..63807d3 100644
--- a/myproject/products/static/products/js/select2-product-search.js
+++ b/myproject/products/static/products/js/select2-product-search.js
@@ -145,4 +145,91 @@
});
};
+ /**
+ * Инициализирует Select2 для позиции заказа (товар или комплект)
+ * Обрабатывает выбор товара/комплекта и обновляет скрытые поля формы
+ *
+ * @param {Element|jQuery} element - DOM элемент select
+ * @param {string} apiUrl - URL API для поиска (по умолчанию из data-ajax-url)
+ */
+ window.initOrderItemSelect2 = function(element, apiUrl) {
+ if (!element) return;
+
+ var $element = $(element);
+
+ // Получаем URL из параметра или data-атрибута
+ var searchUrl = apiUrl || $element.data('ajax-url');
+ if (!searchUrl) {
+ console.error('[initOrderItemSelect2] API URL not provided');
+ return;
+ }
+
+ // Инициализируем базовый Select2 с AJAX поиском (товары + комплекты)
+ window.initProductSelect2(element, 'all', searchUrl);
+
+ // Обработка выбора товара/комплекта
+ $element.on('select2:select', function(e) {
+ if (!e.params || !e.params.data) return;
+
+ var data = e.params.data;
+ var idParts = data.id.split('_');
+ var type = idParts[0]; // 'product' или 'kit'
+ var id = idParts[1];
+
+ // Найти форму и скрытые поля
+ var form = element.closest('.order-item-form');
+ if (!form) return;
+
+ var productField = form.querySelector('[name$="-product"]');
+ var kitField = form.querySelector('[name$="-product_kit"]');
+ var priceField = form.querySelector('[name$="-price"]');
+ var isCustomPriceField = form.querySelector('[name$="-is_custom_price"]');
+
+ var originalPrice = data.actual_price || data.price || '';
+
+ // Установить значение в правильное поле
+ if (type === 'product') {
+ if (productField) productField.value = id;
+ if (kitField) kitField.value = '';
+ if (priceField) priceField.value = originalPrice;
+ } else if (type === 'kit') {
+ if (kitField) kitField.value = id;
+ if (productField) productField.value = '';
+ if (priceField) priceField.value = originalPrice;
+ }
+
+ // Сохраняем оригинальную цену в data-атрибуте
+ if (priceField) {
+ priceField.dataset.originalPrice = originalPrice;
+ }
+
+ // Сбрасываем флаг кастомной цены
+ if (isCustomPriceField) {
+ isCustomPriceField.value = 'false';
+ }
+
+ // Скрываем индикатор кастомной цены
+ var badge = form.querySelector('.custom-price-badge');
+ var priceInfo = form.querySelector('.original-price-info');
+ if (badge) badge.style.display = 'none';
+ if (priceInfo) priceInfo.style.display = 'none';
+ });
+
+ // Очистка при удалении выбора
+ $element.on('select2:clear', function() {
+ var form = element.closest('.order-item-form');
+ if (!form) return;
+
+ var productField = form.querySelector('[name$="-product"]');
+ var kitField = form.querySelector('[name$="-product_kit"]');
+ var priceField = form.querySelector('[name$="-price"]');
+ var quantityField = form.querySelector('[name$="-quantity"]');
+
+ if (productField) productField.value = '';
+ if (kitField) kitField.value = '';
+ if (priceField) priceField.value = '';
+ if (quantityField) quantityField.value = '';
+ });
+ };
+
})(window);