diff --git a/docs/guides/frontend/06-COMPONENT-INVENTORY.md b/docs/guides/frontend/06-COMPONENT-INVENTORY.md index 580f5b79..cee778bd 100644 --- a/docs/guides/frontend/06-COMPONENT-INVENTORY.md +++ b/docs/guides/frontend/06-COMPONENT-INVENTORY.md @@ -232,10 +232,10 @@ Использовать как референс для: - detail screen, который должен уметь переключаться между `showcase` и `management` без смены route и без ощущения двух разных страниц -- page-level controller для domain actions вокруг одного объекта: overview, members, head management, roles -- richer detail layout, где есть сильный header, один основной roster-блок и один secondary-блок ролей, без раздувания служебных summary-panels +- page-level controller для domain actions вокруг одного объекта: overview, members и inline management actions +- richer detail layout, где есть сильный header и один основной roster/workspace-блок, без раздувания служебных summary-panels и вторичных management-panels - member roster с role assignment и person-chip подачей вместо сырых строк участников -- role management на уровне названий ролей и назначений участникам, без фронтового permission-editor +- role management на уровне названий ролей и назначений участникам, встроенный в roster, без фронтового permission-editor С оговоркой: diff --git a/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md b/docs/guides/frontend/09-FRONTEND-AUDIT-MAP.md index 076acf6e..4a72b785 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 уже работает как dual-mode page: showcase-first для обычного просмотра и встроенный management-layer для управленцев, page-level controller вынесен в hook | список отделов всё ещё проще detail screen, а сам модуль ещё не проверен длинным visual-pass и живым backend-сценарием | считать `departments/[id]` baseline reference для object-detail pages с mixed audience и затем при желании подтянуть list screen до той же richness | +| `departments` | `mixed` | detail screen уже работает как dual-mode page: showcase-first для обычного просмотра и встроенный inline management-layer для управленцев, page-level controller вынесен в hook | список отделов всё ещё проще detail screen, а сам модуль ещё не проверен длинным visual-pass и живым backend-сценарием | считать `departments/[id]` baseline reference для object-detail pages с mixed audience и затем при желании подтянуть 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 | @@ -178,7 +178,7 @@ - у `settings` после controller extraction резать section-level UI и только затем geometry - у `departments` держать detail screen в логике `showcase + management layer`, а не возвращать его в mini-admin panel -- detail screen `departments/[id]` уже не считать пустой зоной; дальнейшие работы здесь должны быть про polishing, а не про возврат permission-editor и служебных панелей +- detail screen `departments/[id]` уже не считать пустой зоной; дальнейшие работы здесь должны быть про polishing, а не про возврат permission-editor, служебных панелей и отдельных role/head blocks - у `auth/legal` выровнять isolated geometry отдельно от app-shell жанра ### Волна 7. Calendar special audit diff --git a/frontend/src/app/departments/[id]/page.tsx b/frontend/src/app/departments/[id]/page.tsx index bd0f5bc6..3c5cbfab 100644 --- a/frontend/src/app/departments/[id]/page.tsx +++ b/frontend/src/app/departments/[id]/page.tsx @@ -18,13 +18,12 @@ import { } from "lucide-react"; import { AppShell } from "@/components/AppShell"; -import { DepartmentPersonChip } from "@/components/departments/DepartmentPersonChip"; import { RequestAvatar } from "@/components/requests/RequestAvatar"; import { SearchableSelectSingle } from "@/components/shared/SearchableSelect"; import { Modal } from "@/components/ui/Modal"; import { useDepartmentPage } from "@/hooks/useDepartmentPage"; import { displayUserName, userProfileLink } from "@/lib/shared"; -import type { DepartmentMemberLink, DepartmentRole } from "@/types/api"; +import type { DepartmentMemberLink } from "@/types/api"; function MetaChip({ children, @@ -297,68 +296,6 @@ function DepartmentMemberRow({ ); } -function DepartmentRoleCard({ - canManageRoles, - pendingKey, - role, - usageCount, - onDelete, - onEdit, -}: { - canManageRoles: boolean; - pendingKey: string | null; - role: DepartmentRole; - usageCount: number; - onDelete: (role: DepartmentRole) => Promise; - onEdit: (role: DepartmentRole) => void; -}) { - const isDeleting = pendingKey === `role-delete-${role.id}`; - - return ( -
-
-
-
-

- {role.name} -

- - {usageCount} участников - -
-

- {usageCount - ? "Используется в составе отдела." - : "Пока не назначена участникам отдела."} -

-
- - {canManageRoles ? ( -
- - -
- ) : null} -
-
- ); -} - function DepartmentEditorModal({ draft, isOpen, @@ -811,108 +748,6 @@ export default function DepartmentDetailPage() { )} - {isManagementMode && h.userPerms.can_change_head ? ( -
-
-

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

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

Роли отдела

-

- {isManagementMode - ? "Именованные роли внутри отдела: их можно создавать, переименовывать и назначать участникам." - : "Справочный список ролей, которые используются внутри отдела."} -

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

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

-

- {isManagementMode - ? "Создай первую роль, если внутри отдела нужно разделить обязанности." - : "В этом отделе пока не заведены отдельные внутренние роли."} -

-
- )} -
) : null}