Торговые точки — Список

Роут: /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=draftPOST /api/v1/stores/{id}/publish — без модалки
Снять с публикацииFranchise + status=publishedPOST /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 — нет доступа к странице
  • Редирект на дашборд

Переходы

ОткудаКудаТриггер
СписокКарточка просмотраКлик по названию
СписокФорма созданияКнопка “Создать ТТ”
СписокФорма редактированияДействие “Редактировать”

Ссылки