From b73336744a46ade1e6fdbd42b8490eba823234ac Mon Sep 17 00:00:00 2001 From: lizerk Date: Mon, 13 Apr 2026 21:23:54 +0300 Subject: [PATCH] refactor(frontend): simplify department workspace --- .../guides/frontend/06-COMPONENT-INVENTORY.md | 4 +- docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md | 2 +- frontend/src/app/departments/[id]/page.tsx | 478 ++++++++---------- 3 files changed, 201 insertions(+), 283 deletions(-) diff --git a/docs/guides/frontend/06-COMPONENT-INVENTORY.md b/docs/guides/frontend/06-COMPONENT-INVENTORY.md index 5d2869f6..b3922e9c 100644 --- a/docs/guides/frontend/06-COMPONENT-INVENTORY.md +++ b/docs/guides/frontend/06-COMPONENT-INVENTORY.md @@ -232,8 +232,8 @@ Использовать как референс для: - detail screen, который должен быть полноценным management workspace, а не бедной карточкой-описанием -- page-level controller для domain actions вокруг одного объекта: overview, members, head management, roles, permissions -- richer detail layout, где основной управленческий список сочетается с правой summary/actions колонкой +- page-level controller для domain actions вокруг одного объекта: overview, members, head management, roles +- richer detail layout, где есть сильный header, один основной roster-блок и один secondary-блок настроек, без раздувания служебных summary-panels - member roster с role assignment и person-chip подачей вместо сырых строк участников С оговоркой: diff --git a/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md b/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md index f5776c46..1cd22501 100644 --- a/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md +++ b/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md @@ -34,7 +34,7 @@ | `users/directory` | `mixed` | `users/page.tsx` и `employees/page.tsx` уже живут в app-surface language, сценарии user/employee navigation выровнены и читаются как один cluster | список людей всё ещё проще и беднее по interaction density, чем основные рабочие модули, поэтому это не полноценный stylistic reference | считать baseline-pass завершённым и трогать дальше только при появлении richer directory requirements | | `home/feed` | `mixed` | сильный app-shell fit, хорошая operational density, уже много app primitives | page очень большой, комментарии и post-compose logic перегружены, встречаются legacy `rounded-md` fragments | использовать как reference по feed density, но разрезать modal/comments/post flows и дочистить geometry | | `notifications` | `mixed` | близок к operational app-style, фильтры и list hierarchy уже читаются системно | page-level logic пока монолитная, нет выделенного feature controller, есть место для уплотнения и симметрии с messages/requests | после people cluster сделать короткий structural pass без крупного редизайна | -| `departments` | `mixed` | detail screen уже поднят до полноценного management workspace: overview, members, head management, roles, user-permissions; page-level controller вынесен в hook | список отделов всё ещё проще detail screen, а сам модуль ещё не проверен длинным visual-pass и живым backend-сценарием | считать `departments/[id]` baseline reference для object-management pages и затем при желании подтянуть list screen до той же richness | +| `departments` | `mixed` | detail screen уже поднят до полноценного management workspace: сильный header, команда как основной блок, роли как secondary-блок, page-level controller вынесен в hook | список отделов всё ещё проще detail screen, а сам модуль ещё не проверен длинным visual-pass и живым backend-сценарием | считать `departments/[id]` baseline reference для object-management pages и затем при желании подтянуть list screen до той же richness | | `auth/legal` | `mixed` | изолированные flows уже отделены от app-shell, общая подача аккуратная | `rounded-[2rem]` и локальная hero-card геометрия образуют мини-систему отдельно от app shell | не смешивать с operational refactor; сделать отдельный compact pass по auth/legal geometry | | `documents/dashboard` | `legacy-heavy` | есть готовые data blocks | заметны старые rounded patterns и мелкие utility-решения | включить в documents refactor pass | diff --git a/frontend/src/app/departments/[id]/page.tsx b/frontend/src/app/departments/[id]/page.tsx index ed6c7f0b..8eeb658e 100644 --- a/frontend/src/app/departments/[id]/page.tsx +++ b/frontend/src/app/departments/[id]/page.tsx @@ -5,12 +5,11 @@ import { useParams } from "next/navigation"; import type { ReactNode } from "react"; import { ArrowLeft, - BriefcaseBusiness, Building2, Crown, PencilLine, Plus, - ShieldCheck, + Search, Trash2, UserPlus, Users, @@ -27,32 +26,12 @@ import type { DepartmentRole, } from "@/types/api"; -function StatCard({ - label, - value, - icon, -}: { - label: string; - value: string; - icon: ReactNode; -}) { - return ( -
-
- {icon} - {label} -
-

{value}

-
- ); -} - function PermissionBadge({ active, children, }: { active: boolean; - children: React.ReactNode; + children: ReactNode; }) { return ( ({ id: role.id, name: role.name })); return (
-
+
) : null} + {!member.role && !canAssignRoles ? ( + + Без роли + + ) : null}
-
+
{canAssignRoles ? ( -
- - + />
) : null} -
+
{canChangeHead && !isHead ? (
@@ -591,6 +579,71 @@ export default function DepartmentDetailPage() { Редактировать отдел ) : null} +
+
+ +
+
+

Руководитель

+
+ {h.department.head ? ( + + ) : ( +
+ Руководитель пока не назначен. +
+ )} +
+
+ + {h.userPerms.can_change_head ? ( +
+ +
+ + {h.department.head ? ( + + ) : null} +
+
+ ) : null} +
+ + +
+
+
+
+

Команда отдела

+

+ Основной рабочий блок отдела: состав команды, роли участников и быстрые действия. +

+
{h.userPerms.can_manage ? (
-
-
- } - /> - } - /> - } - /> - } - /> -
- - -
-
-
-
-
-

Участники отдела

-

- Управление составом отдела и ролями участников. -

-
-
- -
-
- -
+
+
+ h.setMembersQuery(event.target.value)} placeholder="Поиск по участникам, почте, должности или роли" - className="app-input w-full rounded-lg px-3 py-2.5 text-sm" + className="app-input w-full rounded-lg py-2.5 pl-9 pr-3 text-sm" />
+ +
-
- {h.filteredMembers.length ? ( - h.filteredMembers.map((member) => ( - - )) - ) : ( -
- -

- Участники не найдены -

-

- Измени поисковый запрос или включи показ неактивных связей. -

-
- )} -
-
- -
-
-
-

Роли отдела

-

- Наборы прав для участников отдела и их назначение в составе команды. -

-
- {h.userPerms.can_assign_roles ? ( - - ) : null} -
- -
- {h.roles.length ? ( - h.roles.map((role) => ( - - )) - ) : ( -
- -

- Роли ещё не созданы -

-

- Создай роли, чтобы распределять управленческие права внутри отдела. -

-
- )} -
-
-
- - + {h.userPerms.can_assign_roles ? ( + + ) : null} +
+ +
+ {h.roles.length ? ( + h.roles.map((role) => ( + + )) + ) : ( +
+

+ Роли ещё не созданы +

+

+ Создай роли, если внутри отдела нужно разделить управленческие права. +

+
+ )} +
+
) : null}