From 46a63f0221c171dd74b7478edc43075f24f28dd4 Mon Sep 17 00:00:00 2001 From: agent-exec-transport Date: Mon, 19 Oct 2026 05:33:07 +0000 Subject: [PATCH] agent-exec transport 73562c7c2cf83a3efd62efd0baae1583/1e09e148c1d0 --- src/components/AccountUsersPanel.tsx | 17 ++++++++++++++--- src/roleMembers.ts | 2 ++ test/role-members.test.ts | 7 ++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/components/AccountUsersPanel.tsx b/src/components/AccountUsersPanel.tsx index 4e38c4b..eeed63d 100644 --- a/src/components/AccountUsersPanel.tsx +++ b/src/components/AccountUsersPanel.tsx @@ -51,6 +51,8 @@ export function AccountUsersPanel() { const [copyValues, setCopyValues] = useState>({}) const [selected, setSelected] = useState(null) const [roleView, setRoleView] = useState(null) + const [fullSourceRole, setFullSourceRole] = useState(null) + const [sourceRoleError, setSourceRoleError] = useState('') const [roles, setRoles] = useState([]) const [roleQuery, setRoleQuery] = useState('') const [roleCursor, setRoleCursor] = useState('') @@ -108,7 +110,7 @@ export function AccountUsersPanel() { roleSequence.current++ setRoleQuery(''); setRoleCursor(''); setRoleTrail([]); setNextRoleCursor(''); setRoleLoading(false) setSelected(null); setRoleView(null); setErr(''); setNotice('') - setCopyName(''); setCopyDescription(''); setCopyValues({}) + setCopyName(''); setCopyDescription(''); setCopyValues({}); setFullSourceRole(null); setSourceRoleError('') const detailResult = await Promise.allSettled([api.adminGetUser(account.userId)]) if (request !== sequence.current) return if (detailResult[0].status === 'rejected') { setErr(String(detailResult[0].reason)); return } @@ -123,6 +125,13 @@ export function AccountUsersPanel() { if (roleResult.status === 'fulfilled' && roleResult.value) { const currentRole = roleResult.value as UserRoleView setRoleView(currentRole); setSelectedRoleId(currentRole.role?.roleId ?? '') + if (canCopyRole && currentRole.role) { + void api.getRole(currentRole.role.roleId).then(role => { + if (request !== sequence.current) return + if (Array.isArray(role?.permissions)) setFullSourceRole(role) + else setSourceRoleError('源角色权限读取不完整,暂不能复制,请重新打开用户') + }).catch(error => { if (request === sequence.current) setSourceRoleError(`读取源角色权限失败:${String(error)}`) }) + } } else { setRoleView(null); setSelectedRoleId('') } if (catalogResult.status === 'fulfilled' && catalogResult.value) setCatalog(catalogResult.value) else setCatalog([]) @@ -268,7 +277,7 @@ export function AccountUsersPanel() { } const copyAndAssign = async () => { - const source = roleView?.role + const source = fullSourceRole if (!selected || !source) return setErr(''); setNotice('') let request @@ -387,7 +396,9 @@ export function AccountUsersPanel() { {canAssignRoles && roleSearch()} {canCopyRole && roleView?.role && catalog.length > 0 && - {copyForm(roleView.role)} + {fullSourceRole ? copyForm(fullSourceRole) + : sourceRoleError ?

{sourceRoleError}

+ :

正在读取源角色权限…

}
} {canViewGrants &&
{catalog.filter(item => item.scope === 'system').map(item =>