diff --git a/frontend/src/app/departments/[id]/page.tsx b/frontend/src/app/departments/[id]/page.tsx index b21e6551..e9396737 100644 --- a/frontend/src/app/departments/[id]/page.tsx +++ b/frontend/src/app/departments/[id]/page.tsx @@ -398,6 +398,7 @@ function DepartmentMembersEmptyState() { function AddMemberModal({ canAssignRoles, + directoryError, isOpen, items, loading, @@ -405,6 +406,7 @@ function AddMemberModal({ optionsLoading, onClose, onCreateRole, + onRetryEmployees, onSave, onSelect, onSelectRole, @@ -413,6 +415,7 @@ function AddMemberModal({ selectedRoleId, }: { canAssignRoles: boolean; + directoryError: string | null; isOpen: boolean; items: Array<{ id: number; name: string }>; loading: boolean; @@ -420,6 +423,7 @@ function AddMemberModal({ optionsLoading: boolean; onClose: () => void; onCreateRole: () => void; + onRetryEmployees: () => Promise; onSave: () => Promise; onSelect: (id: number | null) => void; onSelectRole: (id: number | null) => void; @@ -432,7 +436,7 @@ function AddMemberModal({ optionsLoading, items.length, ); - const selectDisabled = optionsLoading || items.length === 0; + const selectDisabled = optionsLoading || !!directoryError || items.length === 0; const submitDisabled = isDepartmentMemberModalSubmitDisabled({ loading, mode, @@ -477,7 +481,20 @@ function AddMemberModal({ disabled={selectDisabled} /> - {canAssignRoles ? ( + {directoryError ? ( +
+

{directoryError}

+ +
+ ) : null} + + {canAssignRoles && !directoryError ? (
) : null} - {helperText ? ( + {!directoryError && helperText ? (

{helperText}

@@ -855,6 +872,7 @@ export default function DepartmentDetailPage() { ; @@ -66,6 +67,7 @@ export type DepartmentPageController = { openCreateRole: () => void; openDepartmentEditor: () => void; openEditRole: (role: DepartmentRole) => void; + reloadEmployeesDirectory: () => Promise; refreshPage: () => Promise; saveDepartment: () => Promise; saveRole: () => Promise; @@ -136,6 +138,7 @@ export function useDepartmentPage(departmentId: number): DepartmentPageControlle const [userPerms, setUserPerms] = useState(null); const [allEmployees, setAllEmployees] = useState([]); const [employeesDirectoryLoading, setEmployeesDirectoryLoading] = useState(false); + const [employeesDirectoryError, setEmployeesDirectoryError] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [pendingKey, setPendingKey] = useState(null); @@ -166,9 +169,14 @@ export function useDepartmentPage(departmentId: number): DepartmentPageControlle const loadEmployeesDirectory = useCallback(async () => { setEmployeesDirectoryLoading(true); + setEmployeesDirectoryError(null); try { const employees = await loadAllPages((params) => apiClient.getEmployees(params)); setAllEmployees(sortEmployeesByName(employees.filter((employee) => employee.is_active))); + } catch (loadError) { + const message = getErrorMessage(loadError, "Не удалось загрузить сотрудников"); + setEmployeesDirectoryError(message); + throw loadError; } finally { setEmployeesDirectoryLoading(false); } @@ -232,7 +240,12 @@ export function useDepartmentPage(departmentId: number): DepartmentPageControlle }, [loadCore]); useEffect(() => { - if (!userPerms || (!userPerms.can_manage && !userPerms.can_change_head)) { + if ( + !userPerms || + (!userPerms.can_manage && + !userPerms.can_change_head && + !userPerms.can_assign_roles) + ) { return; } if (allEmployees.length > 0) { @@ -292,6 +305,10 @@ export function useDepartmentPage(departmentId: number): DepartmentPageControlle await loadCore(); }, [loadCore]); + const reloadEmployeesDirectory = useCallback(async () => { + await loadEmployeesDirectory(); + }, [loadEmployeesDirectory]); + const updateDepartmentDraft = useCallback((patch: Partial<{ name: string; description: string }>) => { setDepartmentDraft((current) => ({ ...current, ...patch })); }, []); @@ -606,6 +623,7 @@ export function useDepartmentPage(departmentId: number): DepartmentPageControlle departmentDraft, departmentId, editDepartmentOpen, + employeesDirectoryError, employeesDirectoryLoading, error, filteredMembers, @@ -631,6 +649,7 @@ export function useDepartmentPage(departmentId: number): DepartmentPageControlle openCreateRole, openDepartmentEditor, openEditRole, + reloadEmployeesDirectory, refreshPage, saveDepartment, saveRole,