2026-07-05 04:23:47 +04:00
|
|
|
|
# 08. Каталогный домен
|
|
|
|
|
|
|
|
|
|
|
|
## Назначение
|
|
|
|
|
|
Каталогный домен описывает правила формирования витрин, листингов и поисковых выборок для tenant-магазина.
|
|
|
|
|
|
|
|
|
|
|
|
## Поведение системы
|
|
|
|
|
|
- Каталог строится из API-данных и bootstrap-конфигурации.
|
|
|
|
|
|
- Bootstrap определяет структуру страниц каталога и виджеты.
|
|
|
|
|
|
- API возвращает содержимое: товары, категории, метаданные фильтров.
|
|
|
|
|
|
|
|
|
|
|
|
## Обязательные JSON-свойства каталога
|
2026-07-09 00:55:50 +04:00
|
|
|
|
- catalog.defaultSort
|
|
|
|
|
|
- catalog.availableSorts
|
|
|
|
|
|
- catalog.enabledFilters
|
|
|
|
|
|
- catalog.layout
|
2026-07-05 04:23:47 +04:00
|
|
|
|
|
|
|
|
|
|
## Опциональные свойства
|
2026-07-09 00:55:50 +04:00
|
|
|
|
- catalog.navigationMode
|
2026-07-10 15:55:38 +04:00
|
|
|
|
- catalog.loadingStrategy
|
2026-07-09 00:55:50 +04:00
|
|
|
|
- catalog.showBreadcrumbs
|
|
|
|
|
|
- catalog.showCategoryBanner
|
|
|
|
|
|
- catalog.showSubcategoryChips
|
|
|
|
|
|
- catalog.showRatings
|
|
|
|
|
|
- catalog.showDiscounts
|
|
|
|
|
|
- catalog.showAvailability
|
|
|
|
|
|
- catalog.suggestionsEnabled
|
|
|
|
|
|
- catalog.searchHistoryEnabled
|
2026-07-10 15:55:38 +04:00
|
|
|
|
- catalog.features (via bootstrap.features)
|
2026-07-09 00:55:50 +04:00
|
|
|
|
- catalog.facets (future backend-driven)
|
2026-07-05 04:23:47 +04:00
|
|
|
|
|
|
|
|
|
|
## Строгие правила
|
|
|
|
|
|
- Каталог не содержит tenant-specific условий в frontend-коде.
|
|
|
|
|
|
- Сортировка и фильтры должны быть согласованы между frontend и backend.
|
|
|
|
|
|
- Видимость товаров контролируется данными backend, а не frontend-хардкодом.
|
2026-07-10 15:55:38 +04:00
|
|
|
|
- Пустая категория рендерит отдельный catalog empty-state, а не product grid empty-state.
|
|
|
|
|
|
- Корневой переход `All Categories` всегда возвращает category browser `/catalog`.
|
|
|
|
|
|
- Loading strategy выбирается конфигурацией без дублирования list logic.
|
2026-07-05 04:23:47 +04:00
|
|
|
|
|
2026-07-09 00:55:50 +04:00
|
|
|
|
## Reusable Domain Models
|
|
|
|
|
|
- SearchCriteria
|
|
|
|
|
|
- FilterDefinition
|
|
|
|
|
|
- FilterOption
|
|
|
|
|
|
- SortDefinition
|
|
|
|
|
|
- CatalogView
|
|
|
|
|
|
- SearchResult
|
|
|
|
|
|
|
2026-07-05 04:23:47 +04:00
|
|
|
|
## Пример catalog JSON (bootstrap fragment)
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"catalog": {
|
2026-07-10 15:55:38 +04:00
|
|
|
|
"layout": "grid-4",
|
|
|
|
|
|
"loadingStrategy": "pagination",
|
2026-07-09 00:55:50 +04:00
|
|
|
|
"defaultSort": "relevance",
|
|
|
|
|
|
"availableSorts": ["relevance", "latest", "price_asc", "price_desc", "rating", "popular", "discount"],
|
|
|
|
|
|
"enabledFilters": ["price", "availability", "rating", "brand", "category", "subcategory", "discount", "new", "color", "size", "attributes"],
|
|
|
|
|
|
"showBreadcrumbs": true,
|
|
|
|
|
|
"showCategoryBanner": true,
|
|
|
|
|
|
"showSubcategoryChips": true
|
2026-07-05 04:23:47 +04:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-07-10 15:55:38 +04:00
|
|
|
|
## Loading Strategies
|
|
|
|
|
|
- `pagination`
|
|
|
|
|
|
- `loadMore`
|
|
|
|
|
|
- `infiniteScroll`
|
|
|
|
|
|
|
|
|
|
|
|
## Grid Modes
|
|
|
|
|
|
- `grid-2`
|
|
|
|
|
|
- `grid-3`
|
|
|
|
|
|
- `grid-4`
|
|
|
|
|
|
- `list`
|
|
|
|
|
|
- `compact`
|
|
|
|
|
|
|
|
|
|
|
|
Legacy aliases still normalize safely:
|
|
|
|
|
|
- `grid`
|
|
|
|
|
|
- `large-grid`
|
|
|
|
|
|
- `compact-grid`
|
|
|
|
|
|
|
2026-07-05 04:23:47 +04:00
|
|
|
|
## Ответственность Frontend
|
|
|
|
|
|
- Отобразить листинг, фильтры, сортировки и пагинацию.
|
|
|
|
|
|
- Синхронизировать состояние каталога с URL.
|
|
|
|
|
|
- Стабильно обрабатывать пустые и частично заполненные наборы данных.
|
|
|
|
|
|
|
|
|
|
|
|
## Ответственность Backend
|
|
|
|
|
|
- Возвращать согласованные данные для листингов и фильтров.
|
|
|
|
|
|
- Гарантировать корректные totals/pagination.
|
|
|
|
|
|
- Поддерживать стабильные ключи сортировки и фильтрации.
|