From 42fe911e1c84f456fefe6901331dc8f1155f2957 Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Sat, 21 Mar 2026 00:21:39 -0700 Subject: [PATCH] address greptile review feedback (greploop iteration 1) - Separate save failure from refresh failure: close drawer after successful save even if teamInfoCall refresh fails - Preserve unknown permissions not in availablePermissions when saving, preventing silent drops of permissions from newer backend versions Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/components/team/MemberPermissionsDrawer.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ui/litellm-dashboard/src/components/team/MemberPermissionsDrawer.tsx b/ui/litellm-dashboard/src/components/team/MemberPermissionsDrawer.tsx index b3d5745dbc6..f7783e2724f 100644 --- a/ui/litellm-dashboard/src/components/team/MemberPermissionsDrawer.tsx +++ b/ui/litellm-dashboard/src/components/team/MemberPermissionsDrawer.tsx @@ -74,14 +74,23 @@ const MemberPermissionsDrawer: React.FC = ({ if (!accessToken || !member) return; setSaving(true); try { + // Preserve unknown permissions not present in the available set + const availableValues = new Set(availablePermissions.map((p) => p.value)); + const existingUnknown = (member.extra_permissions || []).filter( + (p) => !availableValues.has(p), + ); const updatedMember: Member = { ...member, - extra_permissions: Array.from(selected), + extra_permissions: [...existingUnknown, ...Array.from(selected)], }; await teamMemberUpdateCall(accessToken, teamId, updatedMember); NotificationsManager.success("Permissions updated successfully"); - await onUpdate(); onClose(); + try { + await onUpdate(); + } catch (refreshError) { + console.error("Failed to refresh team data after permission update:", refreshError); + } } catch (error: any) { const errMsg = error?.message || "Failed to update permissions"; NotificationsManager.fromBackend(errMsg);