feat(pos): глобальный поиск товаров независимо от категории и режима витрины

- При поиске (3+ символа) ищет по всем товарам и комплектам, игнорируя выбранную категорию
- Даже в режиме "Витрина" поиск переключается на глобальный по всем товарам
- Добавлена визуальная индикация: кнопка "Все товары" подсвечивается при активном поиске
- При очистке поиска возвращается к товарам выбранной категории или витрине

Изменения:
- terminal.js: loadItems(), renderProducts(), updateSearchIndicator(), обработчики поиска
- views.py: get_items_api() - игнорирование category_id при search_query
This commit is contained in:
2026-01-27 15:20:07 +03:00
parent 7b6a86bdf2
commit 90906944dd

View File

@@ -848,13 +848,18 @@ function renderProducts() {
let filtered; let filtered;
// Если выбран режим витрины - показываем витринные комплекты // Если активен поиск (3+ символов) - показываем результаты поиска по всем товарам
if (isShowcaseView) { // независимо от режима (витрина или обычный)
if (currentSearchQuery && currentSearchQuery.length >= 3 && !isShowcaseView) {
// Обычный режим - ITEMS уже отфильтрованы на сервере (поиск по всем товарам)
filtered = ITEMS;
} else if (isShowcaseView) {
// Режим витрины - показываем витринные комплекты
filtered = showcaseKits; filtered = showcaseKits;
// Для витрины — клиентская фильтрация по поиску // Для витрины — клиентская фильтрация по поиску (только если менее 3 символов)
const searchTerm = document.getElementById('searchInput').value.toLowerCase().trim(); const searchTerm = document.getElementById('searchInput').value.toLowerCase().trim();
if (searchTerm) { if (searchTerm && searchTerm.length < 3) {
const tokens = searchTerm.split(/\s+/).filter(t => t.length > 0); const tokens = searchTerm.split(/\s+/).filter(t => t.length > 0);
filtered = filtered.filter(item => { filtered = filtered.filter(item => {
const name = (item.name || '').toLowerCase(); const name = (item.name || '').toLowerCase();
@@ -864,7 +869,7 @@ function renderProducts() {
}); });
} }
} else { } else {
// Обычный режим - ITEMS уже отфильтрованы на сервере (категория + поиск) // Обычный режим без поиска - ITEMS отфильтрованы по категории
filtered = ITEMS; filtered = ITEMS;
} }
@@ -3864,10 +3869,12 @@ searchInput.addEventListener('input', (e) => {
return; return;
} }
// Для витрины — мгновенная клиентская фильтрация (витрина не участвует в глобальном поиске) // Для витрины при 3+ символах - переключаемся на глобальный поиск по всем товарам
if (isShowcaseView) { if (isShowcaseView) {
renderProducts(); // Выходим из режима витрины для глобального поиска
return; isShowcaseView = false;
// Обновляем UI категорий (снимаем выделение с витрины)
renderCategories();
} }
// Для обычных товаров/комплектов — серверный поиск с debounce 300мс // Для обычных товаров/комплектов — серверный поиск с debounce 300мс