Роли — Список
Список пользовательских и системных ролей франшизы с возможностью перехода в архив удалённых.
Источники
Скрытые роли владельцев партнёров не отображаются
(Введено в BR 1.4.4 §5.2) — Бэк фильтрует список по
owner_legal_entity_id IS NULL(default). Скрытые роли управляются через карточку ЮЛ партнёра, вкладка «Права» — см. Юр. лица — Карточка.
Маршрут
/roles— активные роли (default)/roles?archive=1— архив удалённых
Доступ
(Обновлено в BR 1.4.4 — без enum, через scope + permissions)
| Кто | Доступ |
|---|---|
| Владелец франшизы | Полный (CRUD + удаление + восстановление) |
| Владелец партнёра | Только просмотр активных ролей, назначенных его сотрудникам (для понимания ролевой модели; назначение — через сотрудников) |
| Обычный сотрудник | Если permission roles.read — просмотр; roles.edit — CRUD (обычно не выдаётся). Иначе пункт меню «Роли» скрыт, прямой URL → 403 |
Layout
Шапка
- Заголовок: «Роли» (или «Удалённые роли» в режиме архива)
- Справа кнопки:
- «Добавить роль» (primary, только владелец франшизы /
roles.edit, только в активном режиме) - «Удалённые роли» (ghost-link, только владелец франшизы, переключает на
?archive=1) - В архиве — кнопка «Назад к активным» вместо «Удалённые роли»
- «Добавить роль» (primary, только владелец франшизы /
Фильтры (над таблицей)
| Фильтр | Тип | Описание |
|---|---|---|
| Тип | Radio | Все / Пользовательские / Системные |
| Поиск | Text input с иконкой лупы | По названию, case-insensitive |
Таблица
| Колонка | Источник | Описание |
|---|---|---|
| Название | name | Жирный; если is_system=true — слева иконка шестерёнки + tooltip «Системная роль» |
| Описание | description или «—» | Truncate до 60 символов, tooltip полный текст |
| Сотрудников | employee_count | Число. Если > 0 — кликабельное, ведёт на /employees?role_id={id} |
| Создана | created_at | Дата в формате DD.MM.YYYY |
| Действия | — | Меню «…»: Редактировать, Удалить (скрыто если is_system или employee_count > 0) |
Клик по строке (кроме меню «…» и ссылки на сотрудников) → карточка /roles/:id.
Пагинация
Нижняя пагинация: по 20 на страницу, навигация по номерам страниц.
Состояния
| Состояние | Что показываем |
|---|---|
| Загрузка | 5 skeleton-строк в таблице |
| Пусто (нет ни одной роли) | Illustration + текст «Создайте первую роль для ваших сотрудников» + CTA «Добавить роль» (для admin_franchise) |
| Пусто (фильтр) | «Роли не найдены. Попробуйте изменить фильтр» |
| Архив пуст | «В архиве пока нет удалённых ролей» |
| Ошибка загрузки | Generic error с кнопкой «Повторить» |
Взаимодействия
Удаление через меню «…»
- Клик «Удалить» → модалка подтверждения «Удалить роль “{name}”?»
- При
ROLE_IN_USE(409) — модалка меняется на предупреждение со списком сотрудников (см. Роли — Карточка) + кнопка «Открыть список сотрудников с этой ролью» (ведёт на/employees?role_id={id}) - Успех → toast «Роль перенесена в архив», строка исчезает из списка
Восстановление (режим архива)
- В строке вместо меню «…» — кнопка «Восстановить»
- Клик →
POST /roles/{id}/restore, toast «Роль восстановлена», строка исчезает из архива
Клик по employee_count > 0
Переход на /employees?role_id={id} — страница сотрудников с предустановленным фильтром.
API
GET /api/v1/admin/roles с query:
status=active(default) илиstatus=deletedдля архиваis_system=true|falseпри выбранном фильтреsearch=...при вводеpage,per_page
Response см. в контракте.
Бэк всегда применяет фильтр owner_legal_entity_id IS NULL (default) — скрытые роли владельцев партнёров не возвращаются. (Обновлено в BR 1.4.4)
Для владельца партнёра фронт получает только роли, назначенные его сотрудникам (фильтрация на бэке через scope).