diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index 4bb6956f29..bf951b9a1c 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -501,3 +501,13 @@ async def delete_user_by_id(user_id: str, user=Depends(get_admin_user)): status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.ACTION_PROHIBITED, ) + + +############################ +# GetUserGroupsById +############################ + + +@router.get("/{user_id}/groups") +async def get_user_groups_by_id(user_id: str, user=Depends(get_admin_user)): + return Groups.get_groups_by_member_id(user_id) \ No newline at end of file diff --git a/src/lib/apis/users/index.ts b/src/lib/apis/users/index.ts index 282b5bdca8..bdb44f2627 100644 --- a/src/lib/apis/users/index.ts +++ b/src/lib/apis/users/index.ts @@ -443,3 +443,30 @@ export const updateUserById = async (token: string, userId: string, user: UserUp return res; }; + +export const getUserGroupsById = async (token: string, userId: string) => { + let error = null; + + const res = await fetch(`${WEBUI_API_BASE_URL}/users/${userId}/groups`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + } + }) + .then(async (res) => { + if (!res.ok) throw await res.json(); + return res.json(); + }) + .catch((err) => { + console.error(err); + error = err.detail; + return null; + }); + + if (error) { + throw error; + } + + return res; +}; diff --git a/src/lib/components/admin/Users/UserList/EditUserModal.svelte b/src/lib/components/admin/Users/UserList/EditUserModal.svelte index 0a5301d4c9..e1f5b49768 100644 --- a/src/lib/components/admin/Users/UserList/EditUserModal.svelte +++ b/src/lib/components/admin/Users/UserList/EditUserModal.svelte @@ -4,7 +4,7 @@ import { createEventDispatcher } from 'svelte'; import { onMount, getContext } from 'svelte'; - import { updateUserById } from '$lib/apis/users'; + import { updateUserById, getUserGroupsById } from '$lib/apis/users'; import Modal from '$lib/components/common/Modal.svelte'; import localizedFormat from 'dayjs/plugin/localizedFormat'; @@ -27,6 +27,9 @@ password: '' }; + let _user_groups: any[] = []; + let loadingGroups = false; + const submitHandler = async () => { const res = await updateUserById(localStorage.token, selectedUser.id, _user).catch((error) => { toast.error(`${error}`); @@ -38,10 +41,23 @@ } }; + const loadUserGroups = async () => { + if (!selectedUser?.id) return; + loadingGroups = true; + try { + _user_groups = await getUserGroupsById(localStorage.token, selectedUser.id); + } catch (error) { + toast.error(`${error}`); + } finally { + loadingGroups = false; + } + }; + onMount(() => { if (selectedUser) { _user = selectedUser; _user.password = ''; + loadUserGroups(); } }); @@ -152,6 +168,20 @@ +
+
{$i18n.t('Groups')}
+ + {#if loadingGroups} +
{$i18n.t('Loading groups...')}
+ {:else if _user_groups.length === 0} +
{$i18n.t('No groups assigned')}
+ {:else} +
+ {_user_groups.map(g => g.name).join(', ')} +
+ {/if} +
+