RBAC: Correctly display the new roles after updating user, service account and team roles (#113783)

always fetch the new roles after updating user/team roles
This commit is contained in:
Ieva
2025-11-13 13:29:17 +00:00
committed by GitHub
parent 3e4933ec60
commit 0d67fac87f
2 changed files with 38 additions and 35 deletions
@@ -44,23 +44,25 @@ export const TeamRolePicker = ({
width,
isLoading,
}: Props) => {
const [{ loading, value: appliedRoles = roles || [] }, getTeamRoles] = useAsyncFn(async () => {
try {
if (roles) {
return roles;
const [{ loading, value: appliedRoles = roles || [] }, getTeamRoles] = useAsyncFn(
async (force = false) => {
try {
if (!force && roles) {
return roles;
}
if (!force && apply && Boolean(pendingRoles?.length)) {
return pendingRoles;
}
if (contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesList) && teamId > 0) {
return await fetchTeamRoles(teamId);
}
} catch (e) {
console.error('Error fetching roles', e);
}
if (apply && Boolean(pendingRoles?.length)) {
return pendingRoles;
}
if (contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesList) && teamId > 0) {
return await fetchTeamRoles(teamId);
}
} catch (e) {
console.error('Error loading options', e);
}
return [];
}, [teamId, pendingRoles, roles]);
return [];
},
[teamId, pendingRoles, roles]
);
useEffect(() => {
getTeamRoles();
@@ -69,7 +71,7 @@ export const TeamRolePicker = ({
const onRolesChange = async (roles: Role[]) => {
if (!apply) {
await updateTeamRoles(roles, teamId);
await getTeamRoles();
await getTeamRoles(true); // Force fetch from backend after update
} else if (onApplyRoles) {
onApplyRoles(roles);
}
@@ -54,24 +54,25 @@ export const UserRolePicker = ({
width,
isLoading,
}: Props) => {
const [{ loading, value: appliedRoles = roles || [] }, getUserRoles] = useAsyncFn(async () => {
try {
if (roles) {
return roles;
const [{ loading, value: appliedRoles = roles || [] }, getUserRoles] = useAsyncFn(
async (force = false) => {
try {
if (!force && roles) {
return roles;
}
if (!force && apply && Boolean(pendingRoles?.length)) {
return pendingRoles;
}
if (contextSrv.hasPermission(AccessControlAction.ActionUserRolesList) && userId > 0) {
return await fetchUserRoles(userId, orgId);
}
} catch (e) {
console.error('Error fetching user roles');
}
if (apply && Boolean(pendingRoles?.length)) {
return pendingRoles;
}
if (contextSrv.hasPermission(AccessControlAction.ActionUserRolesList) && userId > 0) {
return await fetchUserRoles(userId, orgId);
}
} catch (e) {
// TODO handle error
console.error('Error loading options');
}
return [];
}, [orgId, userId, pendingRoles, roles]);
return [];
},
[orgId, userId, pendingRoles, roles]
);
useEffect(() => {
// only load roles when there is an Org selected
@@ -83,7 +84,7 @@ export const UserRolePicker = ({
const onRolesChange = async (roles: Role[]) => {
if (!apply) {
await updateUserRoles(roles, userId, orgId);
await getUserRoles();
await getUserRoles(true); // Force fetch from backend after update
} else if (onApplyRoles) {
onApplyRoles(roles, userId, orgId);
}