Добавлена возможность добавлять новые товары в витринный комплект при редактировании

- Интегрирован готовый компонент ProductSearchPicker в модалку редактирования
- Добавлен collapse-блок с поиском товаров, который отображается только в режиме редактирования
- При выборе товара он автоматически добавляется в tempCart или увеличивается количество если уже есть
- Добавлен CSS и JS для компонента product-search-picker
- В view передаётся categories QuerySet для работы фильтров компонента
- Блок добавления товаров показывается только при редактировании, скрыт при создании нового комплекта
This commit is contained in:
2025-12-14 14:00:51 +03:00
parent aff25d0317
commit ce2cfca3f2
3 changed files with 55 additions and 2 deletions

View File

@@ -1354,9 +1354,44 @@ async function openEditKitModal(kitId) {
document.getElementById('createTempKitModalLabel').textContent = 'Редактирование витринного букета';
document.getElementById('confirmCreateTempKit').textContent = 'Сохранить изменения';
// Показываем кнопку "Разобрать" и скрываем поле "Количество букетов" в режиме редактирования
// Показываем кнопку "Разобрать" и блок добавления товаров
document.getElementById('disassembleKitBtn').style.display = 'block';
document.getElementById('showcaseKitQuantityBlock').style.display = 'none';
document.getElementById('addProductBlock').style.display = 'block';
// Инициализируем компонент поиска товаров
setTimeout(() => {
if (window.ProductSearchPicker) {
const picker = ProductSearchPicker.init('#temp-kit-product-picker', {
onAddSelected: function(product, instance) {
if (product) {
// Добавляем товар в tempCart
const cartKey = `product-${product.id}`;
if (tempCart.has(cartKey)) {
// Увеличиваем количество
const existing = tempCart.get(cartKey);
existing.qty += 1;
} else {
// Добавляем новый товар
tempCart.set(cartKey, {
id: product.id,
name: product.text || product.name,
price: Number(product.price || 0),
qty: 1,
type: 'product'
});
}
// Обновляем отображение
renderTempKitItems();
// Очищаем выбор в пикере
instance.clearSelection();
}
}
});
}
}, 100);
// Открываем модальное окно
const modal = new bootstrap.Modal(document.getElementById('createTempKitModal'));
@@ -1886,9 +1921,10 @@ document.getElementById('createTempKitModal').addEventListener('hidden.bs.modal'
document.getElementById('createTempKitModalLabel').textContent = 'Создать витринный букет из корзины';
document.getElementById('confirmCreateTempKit').innerHTML = '<i class="bi bi-check-circle"></i> Создать и зарезервировать';
// Скрываем кнопку "Разобрать" и показываем поле "Количество букетов"
// Скрываем кнопку "Разобрать" и блок добавления товаров
document.getElementById('disassembleKitBtn').style.display = 'none';
document.getElementById('showcaseKitQuantityBlock').style.display = 'block';
document.getElementById('addProductBlock').style.display = 'none';
}
});

View File

@@ -4,6 +4,7 @@
{% block extra_css %}
<link rel="stylesheet" href="{% static 'pos/css/terminal.css' %}">
<link rel="stylesheet" href="{% static 'products/css/product-search-picker.css' %}">
{% endblock %}
{% block content %}
@@ -186,6 +187,20 @@
</div>
</div>
<!-- Добавление товаров в комплект (режим редактирования) -->
<div class="mb-3" id="addProductBlock" style="display: none;">
<button class="btn btn-sm btn-outline-primary w-100" type="button" data-bs-toggle="collapse" data-bs-target="#productSearchCollapse" aria-expanded="false">
<i class="bi bi-plus-circle"></i> Добавить товар в комплект
</button>
<div class="collapse mt-2" id="productSearchCollapse">
<div class="card card-body p-2">
{% load static %}
{% include 'products/components/product_search_picker.html' with container_id='temp-kit-product-picker' title='Поиск товара...' show_filters=False show_view_toggle=False add_button_text='Добавить' content_height='200px' %}
</div>
</div>
</div>
<!-- Блок ценообразования -->
<div class="card">
<div class="card-header bg-light">
@@ -484,5 +499,6 @@
}
</script>
<script src="{% static 'products/js/product-search-picker.js' %}"></script>
<script src="{% static 'pos/js/terminal.js' %}"></script>
{% endblock %}

View File

@@ -270,6 +270,7 @@ def pos_terminal(request):
'categories_json': json.dumps(categories),
'items_json': json.dumps([]), # Пустой массив - загрузка по API при клике на категорию
'showcase_kits_json': json.dumps([]), # Пустой массив - загрузка по API
'categories': categories_qs, # QuerySet для компонента product_search_picker
'current_warehouse': {
'id': current_warehouse.id,
'name': current_warehouse.name