Каталог — Версии
Deprecated
Версионирование каталога (draft/published/archived) упразднено. Каталог работает без версий — изменения применяются напрямую. Категории вынесены в standalone раздел Каталог — Категории.
Роут:
API: /catalog/versionsGET /api/v1/catalog/versions, POST /api/v1/catalog/versions, DELETE /api/v1/catalog/versions/{id}, POST /api/v1/catalog/publish, POST /api/v1/catalog/versions/{id}/products, DELETE /api/v1/catalog/versions/{id}/products/{productId}, PATCH /api/v1/catalog/versions/{id}/products/{productId}, GET /api/v1/catalog/versions/{id}/categories, POST /api/v1/catalog/versions/{id}/categories, PATCH /api/v1/catalog/versions/{id}/categories/{categoryId}, DELETE /api/v1/catalog/versions/{id}/categories/{categoryId}
Что видит пользователь
Страница со списком версий каталога в виде таблицы. Вверху — заголовок “Версии каталога”. Страница доступна только для роли Franchise — у остальных ролей скрыта в сайдбаре.
Таблица
Колонки
| Колонка | Данные | Примечание |
|---|---|---|
| Версия | version_number | Формат: v1, v2, … Кликабельная — переход к содержимому версии |
| Статус | status | Бейдж (см. ниже) |
| Дата публикации | published_at | Формат: DD.MM.YYYY HH:mm. Если draft — ”—“ |
| Кол-во товаров | product_count | Число |
| Категорий | category_count | Число (BR 1.7.1) |
| Действия | — | Кнопки: “Опубликовать” / “Удалить черновик” (см. ниже) |
Отображение статусов
| Статус | Бейдж | Текст |
|---|---|---|
draft | Серый | Черновик |
published | Зелёный | Опубликована |
archived | Серый italic | Архив |
Действия
(Обновлено в BR 1.7.1)
Кнопки в шапке
| Кнопка | Видимость | Что происходит |
|---|---|---|
| ”Создать черновик” | Нет draft-версии | Модалка подтверждения → POST /api/v1/catalog/versions |
| ”Удалить черновик” | Есть draft-версия | Модалка подтверждения → DELETE /api/v1/catalog/versions/{id} |
Кнопка “Опубликовать” (в строке таблицы)
- Видна только для строки со статусом
draft - Видна только роли Franchise
Модалки подтверждений
Создание черновика
(Добавлено в BR 1.7.1)
Триггер: клик “Создать черновик” в шапке
API: POST /api/v1/catalog/versions
- Заголовок: “Создать черновик каталога”
- Текст: “Создать черновик каталога? Будет скопирован состав текущей опубликованной версии.”
- Кнопки: “Отмена” / “Создать” (фиолетовая)
- После успеха: добавить строку draft в таблицу, toast “Черновик каталога v{N} создан”
- Ошибка
DRAFT_ALREADY_EXISTS: toast “Черновик уже существует” - Ошибка
NO_PUBLISHED_VERSION: toast “Нет опубликованной версии для копирования”
Удаление черновика
(Добавлено в BR 1.7.1)
Триггер: клик “Удалить черновик” в шапке
API: DELETE /api/v1/catalog/versions/{id}
- Заголовок: “Удалить черновик”
- Текст: “Удалить черновик каталога v{N}? Все неопубликованные изменения будут потеряны.”
- Кнопки: “Отмена” / “Удалить” (красная)
- После успеха: убрать строку draft из таблицы, toast “Черновик удалён”
Публикация
Триггер: клик “Опубликовать” в строке draft-версии
API: POST /api/v1/catalog/publish
- Заголовок: “Публикация каталога”
- Текст: “Опубликовать каталог v{N}? Текущая опубликованная версия уйдёт в архив.”
- Кнопки: “Отмена” / “Опубликовать” (зелёная)
- Состояние: кнопка “Опубликовать” показывает спиннер во время запроса, блокируется
- После успеха: обновить статусы в таблице (draft → published, published → archived), toast “Каталог v{N} опубликован”
Содержимое версии
Роут: /catalog/versions/:id
API: GET /api/v1/catalog/versions/{id}
При клике на строку версии — переход на страницу с содержимым версии.
Просмотр (published / archived)
(Обновлено в BR 1.7.2)
Readonly двухпанельный вид:
| Секция | Описание |
|---|---|
| Заголовок | ”Каталог v{N}” + бейдж статуса |
| Левая панель | Дерево категорий (readonly) + “Без категории” |
| Правая панель | Товары выбранной категории (readonly): Название, Тип |
При клике на категорию слева → справа показываются товары этой категории.
Кнопка “Назад к версиям” — возврат на /catalog/versions.
Конструктор черновика (draft)
(Обновлено в BR 1.7.2)
Двухпанельный конструктор — один экран для управления составом каталога.
Заголовок
“Черновик каталога v{N}” + бейдж “Черновик” + кнопки “Опубликовать” и “Удалить черновик”.
Левая панель: дерево категорий
API: GET /api/v1/catalog/versions/{id}/categories
Дерево с неограниченной вложенностью. Inline-действия (видны при hover):
| Действие | Иконка | API |
|---|---|---|
| Добавить подкатегорию | ⊕ | POST /api/v1/catalog/versions/{id}/categories с parent_id |
| Переименовать | ✏ | PATCH /api/v1/catalog/versions/{id}/categories/{categoryId} |
| Удалить | ✗ | DELETE /api/v1/catalog/versions/{id}/categories/{categoryId} |
| Деактивировать / Активировать | Toggle | PATCH ... с is_active + cascade |
Кнопка “Добавить корневую категорию” внизу дерева.
“Без категории” — специальный пункт внизу дерева. Показывает товары, добавленные в каталог, но не привязанные к категории (category_id = null в catalog_version_products).
Модалки удаления/деактивации/активации — аналогичны описанным в deprecated Каталог — Категории.
Правая панель: товары выбранной категории
При клике на категорию слева → таблица товаров этой категории:
| Колонка | Данные | Примечание |
|---|---|---|
| Название | name | Текущие данные товара |
| Тип | type | Бейдж |
| — | (BR 1.10) Убрана — определяется прейскурантом | |
| Действия | — | Кнопка “Убрать” → DELETE /api/v1/catalog/versions/{id}/products/{productId} |
Кнопка “Добавить товар”
Над таблицей правой панели. Открывает модалку:
- Выбрать товар из справочника (список из
GET /api/v1/productsс поиском) - Кнопка “Добавить” →
POST /api/v1/catalog/versions/{id}/productsсcategory_id= текущая выбранная категория (или null если “Без категории”)
Ошибка PRODUCT_ALREADY_IN_CATALOG: toast “Товар уже добавлен в каталог”.
Кнопка “Убрать” (в строке)
- Модалка: “Убрать товар [название] из каталога?”
- Кнопки: “Отмена” / “Убрать”
- После успеха: строка исчезает, toast “Товар убран из каталога”
Модификаторы товара (read-only)
(Обновлено в BR 1.8.1)
При наведении на товар — tooltip с привязанными модификаторами из его версии:
Модификаторы:
• Размер пиццы (1-1)
• Добавки (0-3)
Управление модификаторами — в карточке товара.
Кнопка “Перейти к товару” → /catalog/products/{id} (таб “Модификаторы”).
Модификаторы редактируются в карточке товара
Модификаторы — свойство товара. Изменения применяются мгновенно.
Перемещение товара между категориями
- MVP: убрать из одной категории → добавить в другую (или
PATCH /api/v1/catalog/versions/{id}/products/{productId}сcategory_id) - Phase 2: drag-and-drop
Цены
Управление ценами вынесено в отдельный раздел Прейскуранты. Цены редактируются напрямую в карточке прейскуранта, без привязки к версиям каталога.
Состояния
| Состояние | Что показываем |
|---|---|
| Загрузка | Skeleton-таблица (placeholder строк) |
| Пусто | ”Версий каталога пока нет.” |
| Ошибка загрузки | ”Не удалось загрузить данные” + кнопка “Повторить” |
| Публикация в процессе | Спиннер на кнопке “Опубликовать”, кнопка заблокирована |
Ролевая видимость
Franchise
- Полный доступ к странице
- Видит все версии (draft, published, archived)
- Может создавать и удалять черновик (BR 1.7.1)
- Может управлять составом черновика (добавить/убрать товар, перемещать по категориям) (BR 1.7.1)
- Может публиковать draft-версию
Franchisee
- Нет доступа — страница скрыта в сайдбаре
- При прямом переходе по URL — редирект на дашборд
Manager
- Нет доступа — страница скрыта в сайдбаре
- При прямом переходе по URL — редирект на дашборд
Cashier
- 403 Forbidden — нет доступа к странице
- Редирект на дашборд
Переходы
| Откуда | Куда | Триггер |
|---|---|---|
| Список версий | Просмотр версии (readonly) | Клик по номеру published/archived версии |
| Список версий | Конструктор черновика | Клик по номеру draft версии |
| Просмотр/Конструктор | Список версий | Кнопка “Назад к версиям” |