feat(tradein/ui): team-дашборд менеджера — сотрудники, квоты, история (#2556) #2565

Merged
lekss361 merged 2 commits from feat/tradein-team-dashboard into main 2026-07-30 19:27:32 +00:00
Owner

Closes #2556 (эпик #2549, шаг 6/8).

  • app/team/page.tsx + components/team/: таблица сотрудников (статус, квота used/limit, пагинация), модалка создания (клиентская валидация username зеркалит backend-regex, показ/скрытие пароля, экран «передайте пароль сотруднику»), редактор квоты + сброс пароля, drawer истории оценок
  • lib/team-api.ts — типизированный клиент поверх apiFetch, teamErrorMessage() для 409/403/404/422 (включая Pydantic detail:[{msg}])
  • Пункт «Команда» в Topbar + .team-* классы в существующем trade-in.css (токены проекта, не свой дизайн-язык)

Гейтинг по роли — два слоя. Важно: legacy-роль analyst имеет paths: ["/**"] без явного deny на /api/v1/team, поэтому обычного path-фильтра мало — добавлен явный roleGate (admin|manager) на видимость пункта меню. Сама страница дополнительно проверяет роль из /me до первого запроса и обрабатывает 403 от списка (прямой заход по URL не крашит и не течёт данными); backend всё равно 403-ит не-admin/manager.

Пагинация: limit=50, «Далее» активна пока вернулось ровно limit строк (в контракте нет total count). NB: устойчивость порядка обеспечивается фиксом ORDER BY created_at DESC, id DESC (#2554 follow-up) — он должен лечь до seed #2564.

tsc --noEmit + lint + npm run build чисто (/team — 9.12 kB). Тест-раннера в бандле нет. Визуальная проверка — на проде после мержа.

Closes #2556 (эпик #2549, шаг 6/8). - `app/team/page.tsx` + `components/team/`: таблица сотрудников (статус, квота used/limit, пагинация), модалка создания (клиентская валидация username зеркалит backend-regex, показ/скрытие пароля, экран «передайте пароль сотруднику»), редактор квоты + сброс пароля, drawer истории оценок - `lib/team-api.ts` — типизированный клиент поверх `apiFetch`, `teamErrorMessage()` для 409/403/404/422 (включая Pydantic `detail:[{msg}]`) - Пункт «Команда» в Topbar + `.team-*` классы в существующем `trade-in.css` (токены проекта, не свой дизайн-язык) **Гейтинг по роли — два слоя.** Важно: legacy-роль `analyst` имеет `paths: ["/**"]` без явного deny на `/api/v1/team`, поэтому обычного path-фильтра мало — добавлен явный `roleGate` (admin|manager) на видимость пункта меню. Сама страница дополнительно проверяет роль из `/me` до первого запроса и обрабатывает 403 от списка (прямой заход по URL не крашит и не течёт данными); backend всё равно 403-ит не-admin/manager. Пагинация: limit=50, «Далее» активна пока вернулось ровно `limit` строк (в контракте нет total count). NB: устойчивость порядка обеспечивается фиксом `ORDER BY created_at DESC, id DESC` (#2554 follow-up) — он должен лечь до seed #2564. `tsc --noEmit` + lint + `npm run build` чисто (`/team` — 9.12 kB). Тест-раннера в бандле нет. Визуальная проверка — на проде после мержа.
lekss361 added 1 commit 2026-07-30 19:04:00 +00:00
feat(tradein/ui): team-дашборд менеджера — сотрудники, квоты, история (#2556)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m9s
f112a4affb
Единая страница /team для ролей admin/manager (backend сам скоупит список
по org-изоляции) — таблица сотрудников с пагинацией, создание сотрудника
с ручным паролем, изменение месячной квоты + сброс пароля одним PATCH,
drawer с историей оценок. Nav-пункт «Команда» в Topbar виден только
admin/manager (доп. roleGate поверх isPathAllowed — legacy analyst-роль
иначе тоже прошла бы path-фильтр).
bot-backend added 1 commit 2026-07-30 19:12:48 +00:00
fix(tradein/ui): пагинация на границе страницы + запрос списка только для admin/manager (#2556)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 14s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 14s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m30s
1ed0338b95
EmployeeTable: убран ранний return при пустом списке — на offset>0 (ровно
50/100/150 сотрудников) пейджер и кнопка «Назад» теперь остаются доступны;
текст различает «сотрудников вообще нет» (offset=0) и «страница за концом
списка» (offset>0).

team/page.tsx: useEmployees получает enabled=isAllowedRole, вычисленный ДО
вызова хука — прямой заход employee/analyst/pilot на /team больше не шлёт
обречённый GET до отрисовки role-gate.
lekss361 merged commit 80d54cb5cd into main 2026-07-30 19:27:32 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2565
No description provided.