Торговые точки — Список
Роут: /stores
API: GET /api/v1/stores
Что видит пользователь
Страница со списком торговых точек в виде таблицы. Вверху — заголовок “Торговые точки”, строка поиска и фильтры. Справа от заголовка — кнопка “Создать ТТ” (только Franchise).
Таблица
Колонки
| Колонка | Данные | Примечание |
|---|---|---|
| Название | name | Кликабельное — переход в карточку |
| Адрес | address | |
| ЮЛ | legal_entity.name | Наименование привязанного юридического лица |
| Статус | status | Бейдж (см. ниже) |
| Город | city | Если пусто — ”—“ |
| Действия | — | Меню с действиями (см. ниже) |
Отображение статусов
| Статус | Бейдж | Текст |
|---|---|---|
draft | Серый | Черновик |
published | Зелёный | Опубликована |
suspended | Красный | Приостановлена |
Фильтры
| Фильтр | Тип | Значения | Default |
|---|---|---|---|
| Статус | Select | Все / Черновик / Опубликована / Приостановлена | Все |
| ЮЛ | Select | Все + список ЮЛ (из GET /api/v1/legal-entities) | Все |
| Город | Select | Все + список городов (из ТТ) | Все |
Фильтры применяются мгновенно (без кнопки “Применить”). При смене фильтра — сброс на page=1.
Поиск
- Поле ввода с placeholder “Поиск по названию или адресу”
- Поиск с debounce (300ms)
- Query param:
search - Ищет по обоим полям одновременно (на бэкенде)
Сортировка
- По названию А-Я (default:
sort=name_asc) - Клик по заголовку колонки “Название” переключает A-Я / Я-A
Пагинация
- 20 записей на страницу
- Постраничная навигация внизу (номера страниц + стрелки)
- Query params:
page,per_page
Действия
Кнопки в шапке
| Кнопка | Переход | Видимость |
|---|---|---|
| ”Создать ТТ” | /stores/new | Только Franchise |
Меню действий строки
| Действие | Видимость | Что происходит |
|---|---|---|
| Редактировать | Franchise — всегда; Franchisee — свои; Manager — своя | Переход в /stores/{id}/edit |
| Опубликовать | Franchise + status=draft | POST /api/v1/stores/{id}/publish — без модалки |
| Снять с публикации | Franchise + status=published | POST /api/v1/stores/{id}/unpublish — без модалки |
| Удалить | Franchise | Модалка подтверждения |
Модалки подтверждений
Удаление
Триггер: клик “Удалить” в меню строки
API: DELETE /api/v1/stores/{id}
Сценарий 1 — ТТ опубликована (status=published):
- Заголовок: “Невозможно удалить”
- Текст: “Сначала снимите с публикации”
- Кнопка: “Понятно” (закрывает модалку)
Сценарий 2 — есть привязанные сотрудники:
- Заголовок: “Удаление торговой точки”
- Текст: “У торговой точки [название] есть привязанные сотрудники. Они будут откреплены.”
- Кнопки: “Отмена” / “Удалить” (красная)
- После успеха: убрать строку из таблицы, toast “Торговая точка удалена”
Сценарий 3 — нет препятствий:
- Заголовок: “Удаление торговой точки”
- Текст: “Удалить торговую точку [название]? Это действие нельзя отменить.”
- Кнопки: “Отмена” / “Удалить” (красная)
- После успеха: убрать строку из таблицы, toast “Торговая точка удалена”
Публикация
Без модалки. POST /api/v1/stores/{id}/publish → обновить статус в таблице, toast “Торговая точка опубликована”.
Снятие с публикации
Без модалки. POST /api/v1/stores/{id}/unpublish → обновить статус в таблице, toast “Торговая точка снята с публикации”.
Состояния
| Состояние | Что показываем |
|---|---|
| Загрузка | Skeleton-таблица (placeholder строк) |
| Пусто (Franchise) | “Торговые точки пока не добавлены” + кнопка “Создать ТТ” |
| Пусто (Franchisee/Manager) | “Торговые точки пока не добавлены” |
| Ошибка загрузки | ”Не удалось загрузить данные” + кнопка “Повторить” |
| Пустой поиск | ”Ничего не найдено по запросу «…»” |
Ролевая видимость
Franchise
- Видит все ТТ
- Все действия: создание, редактирование, публикация, снятие, удаление
- Все фильтры
Franchisee
- Видит только свои ТТ (привязанные к его ЮЛ, API фильтрует автоматически)
- Нет кнопки “Создать ТТ”
- Нет действий: удалить, опубликовать, снять с публикации
- Есть: редактировать (только свои)
Manager
- Видит только свою ТТ (API фильтрует автоматически)
- Нет кнопок: “Создать ТТ”
- Есть: редактировать (только свою)
- Нет: удалить, опубликовать, снять с публикации
Cashier
- 403 Forbidden — нет доступа к странице
- Редирект на дашборд
Переходы
| Откуда | Куда | Триггер |
|---|---|---|
| Список | Карточка просмотра | Клик по названию |
| Список | Форма создания | Кнопка “Создать ТТ” |
| Список | Форма редактирования | Действие “Редактировать” |