feat(pos): глобальный поиск с учетом режима витрины
- При поиске из режима "Витрина" показываются товары И витринные комплекты - При поиске из других категорий - только обычные товары и комплекты - При очистке поиска возвращается к предыдущему режиму (витрина или категория) - Добавлена визуальная индикация глобального поиска (подсветка "Все товары") Изменения: - terminal.js: добавлена переменная wasShowcaseViewBeforeSearch, обновлены renderProducts(), обработчики поиска - views.py: get_items_api() игнорирует category_id при search_query
This commit is contained in:
@@ -65,6 +65,9 @@ let searchDebounceTimer = null;
|
|||||||
let isEditMode = false;
|
let isEditMode = false;
|
||||||
let editingKitId = null;
|
let editingKitId = null;
|
||||||
|
|
||||||
|
// Переменная для сохранения состояния витрины перед поиском
|
||||||
|
let wasShowcaseViewBeforeSearch = false;
|
||||||
|
|
||||||
// Временная корзина для модального окна создания/редактирования комплекта
|
// Временная корзина для модального окна создания/редактирования комплекта
|
||||||
const tempCart = new Map();
|
const tempCart = new Map();
|
||||||
|
|
||||||
@@ -848,26 +851,30 @@ function renderProducts() {
|
|||||||
|
|
||||||
let filtered;
|
let filtered;
|
||||||
|
|
||||||
// Если активен поиск (3+ символов) - показываем результаты поиска по всем товарам
|
// Если активен поиск (3+ символов) - показываем результаты поиска
|
||||||
// независимо от режима (витрина или обычный)
|
if (currentSearchQuery && currentSearchQuery.length >= 3) {
|
||||||
if (currentSearchQuery && currentSearchQuery.length >= 3 && !isShowcaseView) {
|
// Базовые результаты - товары из API (поиск по всем товарам)
|
||||||
// Обычный режим - ITEMS уже отфильтрованы на сервере (поиск по всем товарам)
|
filtered = [...ITEMS];
|
||||||
filtered = ITEMS;
|
|
||||||
} else if (isShowcaseView) {
|
|
||||||
// Режим витрины - показываем витринные комплекты
|
|
||||||
filtered = showcaseKits;
|
|
||||||
|
|
||||||
// Для витрины — клиентская фильтрация по поиску (только если менее 3 символов)
|
// Если перед началом поиска была активна витрина - добавляем витринные комплекты в результаты
|
||||||
const searchTerm = document.getElementById('searchInput').value.toLowerCase().trim();
|
if (wasShowcaseViewBeforeSearch) {
|
||||||
if (searchTerm && searchTerm.length < 3) {
|
const searchTerm = currentSearchQuery.toLowerCase().trim();
|
||||||
const tokens = searchTerm.split(/\s+/).filter(t => t.length > 0);
|
const tokens = searchTerm.split(/\s+/).filter(t => t.length > 0);
|
||||||
filtered = filtered.filter(item => {
|
|
||||||
|
// Фильтруем витринные комплекты по поисковому запросу
|
||||||
|
const filteredShowcaseKits = showcaseKits.filter(item => {
|
||||||
const name = (item.name || '').toLowerCase();
|
const name = (item.name || '').toLowerCase();
|
||||||
const sku = (item.sku || '').toLowerCase();
|
const sku = (item.sku || '').toLowerCase();
|
||||||
// Каждый токен должен совпадать хотя бы с одним словом в name или sku
|
// Каждый токен должен совпадать хотя бы с одним словом в name или sku
|
||||||
return tokens.every(token => name.includes(token) || sku.includes(token));
|
return tokens.every(token => name.includes(token) || sku.includes(token));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Объединяем товары и витринные комплекты
|
||||||
|
filtered = [...filtered, ...filteredShowcaseKits];
|
||||||
}
|
}
|
||||||
|
} else if (isShowcaseView) {
|
||||||
|
// Режим витрины без поиска - показываем все витринные комплекты
|
||||||
|
filtered = showcaseKits;
|
||||||
} else {
|
} else {
|
||||||
// Обычный режим без поиска - ITEMS отфильтрованы по категории
|
// Обычный режим без поиска - ITEMS отфильтрованы по категории
|
||||||
filtered = ITEMS;
|
filtered = ITEMS;
|
||||||
@@ -3856,8 +3863,14 @@ searchInput.addEventListener('input', (e) => {
|
|||||||
if (query === '') {
|
if (query === '') {
|
||||||
currentSearchQuery = '';
|
currentSearchQuery = '';
|
||||||
updateSearchIndicator(); // Обновляем индикацию
|
updateSearchIndicator(); // Обновляем индикацию
|
||||||
|
// Если поиск начинался с витрины - возвращаемся к витрине
|
||||||
|
if (wasShowcaseViewBeforeSearch) {
|
||||||
|
isShowcaseView = true;
|
||||||
|
wasShowcaseViewBeforeSearch = false;
|
||||||
|
renderCategories();
|
||||||
|
renderProducts();
|
||||||
|
} else if (!isShowcaseView) {
|
||||||
// Возвращаем товары выбранной категории
|
// Возвращаем товары выбранной категории
|
||||||
if (!isShowcaseView) {
|
|
||||||
loadItems();
|
loadItems();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -3869,8 +3882,10 @@ searchInput.addEventListener('input', (e) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Для витрины при 3+ символах - переключаемся на глобальный поиск по всем товарам
|
// Для витрины при 3+ символах - сохраняем состояние и переключаемся на глобальный поиск
|
||||||
if (isShowcaseView) {
|
if (isShowcaseView) {
|
||||||
|
// Сохраняем, что была активна витрина перед поиском
|
||||||
|
wasShowcaseViewBeforeSearch = true;
|
||||||
// Выходим из режима витрины для глобального поиска
|
// Выходим из режима витрины для глобального поиска
|
||||||
isShowcaseView = false;
|
isShowcaseView = false;
|
||||||
// Обновляем UI категорий (снимаем выделение с витрины)
|
// Обновляем UI категорий (снимаем выделение с витрины)
|
||||||
@@ -3899,8 +3914,14 @@ clearSearchBtn.addEventListener('click', () => {
|
|||||||
clearSearchBtn.style.display = 'none';
|
clearSearchBtn.style.display = 'none';
|
||||||
currentSearchQuery = '';
|
currentSearchQuery = '';
|
||||||
updateSearchIndicator(); // Обновляем индикацию
|
updateSearchIndicator(); // Обновляем индикацию
|
||||||
|
// Если поиск начинался с витрины - возвращаемся к витрине
|
||||||
|
if (wasShowcaseViewBeforeSearch) {
|
||||||
|
isShowcaseView = true;
|
||||||
|
wasShowcaseViewBeforeSearch = false;
|
||||||
|
renderCategories();
|
||||||
|
renderProducts();
|
||||||
|
} else if (!isShowcaseView) {
|
||||||
// Возвращаем товары выбранной категории
|
// Возвращаем товары выбранной категории
|
||||||
if (!isShowcaseView) {
|
|
||||||
loadItems();
|
loadItems();
|
||||||
} else {
|
} else {
|
||||||
renderProducts(); // Для витрины - просто перерисовываем
|
renderProducts(); // Для витрины - просто перерисовываем
|
||||||
|
|||||||
Reference in New Issue
Block a user