Server-side search in POS: instant search by name and SKU with debounce 300ms

This commit is contained in:
2025-11-17 16:10:23 +03:00
parent 42c6e086da
commit c06e569cbd
2 changed files with 62 additions and 19 deletions

View File

@@ -266,15 +266,17 @@ def get_showcase_kits_api(request):
@require_http_methods(["GET"])
def get_items_api(request):
"""
API endpoint для получения товаров и комплектов с пагинацией.
API endpoint для получения товаров и комплектов с пагинацией и поиском.
Параметры:
- category_id: ID категории (опционально, для фильтрации)
- query: поисковый запрос по name или sku (опционально)
- page: номер страницы (по умолчанию 1)
- page_size: размер страницы (по умолчанию 60)
Сортировка по умолчанию: по свободному остатку (available - reserved) DESC
"""
from products.models import ProductPhoto, ProductKitPhoto
from django.core.paginator import Paginator
from django.db.models import Q
# Получаем текущий склад
current_warehouse = get_pos_warehouse(request)
@@ -284,8 +286,9 @@ def get_items_api(request):
'error': 'Нет активного склада'
}, status=400)
# Параметры пагинации
# Параметры пагинации и поиска
category_id = request.GET.get('category_id')
search_query = request.GET.get('query', '').strip()
page = int(request.GET.get('page', 1))
page_size = int(request.GET.get('page_size', 60))
@@ -328,6 +331,12 @@ def get_items_api(request):
if category_id:
products_qs = products_qs.filter(categories__id=category_id)
# Фильтруем по поисковому запросу (name или sku)
if search_query:
products_qs = products_qs.filter(
Q(name__icontains=search_query) | Q(sku__icontains=search_query)
)
# Сериализуем товары
products = []
for p in products_qs:
@@ -373,6 +382,12 @@ def get_items_api(request):
if category_id:
kits_qs = kits_qs.filter(categories__id=category_id)
# Фильтруем комплекты по поисковому запросу (name или sku)
if search_query:
kits_qs = kits_qs.filter(
Q(name__icontains=search_query) | Q(sku__icontains=search_query)
)
# Сериализуем комплекты
kits = []
for k in kits_qs: