diff --git a/backend/open_webui/routers/groups.py b/backend/open_webui/routers/groups.py index 7d2efcf899..3ac03fe2a4 100755 --- a/backend/open_webui/routers/groups.py +++ b/backend/open_webui/routers/groups.py @@ -78,7 +78,7 @@ async def create_new_group(form_data: GroupForm, user=Depends(get_admin_user)): @router.get("/id/{id}", response_model=Optional[GroupResponse]) -async def get_group_by_id(id: str, user=Depends(get_admin_user)): +async def get_group_by_id(id: str, user=Depends(get_verified_user)): group = Groups.get_group_by_id(id) if group: return GroupResponse( diff --git a/src/lib/components/workspace/common/AccessControl.svelte b/src/lib/components/workspace/common/AccessControl.svelte index 0770b0f365..ac1b3d3a06 100644 --- a/src/lib/components/workspace/common/AccessControl.svelte +++ b/src/lib/components/workspace/common/AccessControl.svelte @@ -3,11 +3,11 @@ const i18n = getContext('i18n'); - import { getGroups } from '$lib/apis/groups'; import Tooltip from '$lib/components/common/Tooltip.svelte'; import Plus from '$lib/components/icons/Plus.svelte'; import UserCircleSolid from '$lib/components/icons/UserCircleSolid.svelte'; import XMark from '$lib/components/icons/XMark.svelte'; + import MemberSelector from '$lib/components/workspace/common/MemberSelector.svelte'; import Badge from '$lib/components/common/Badge.svelte'; export let onChange: Function = () => {}; @@ -18,8 +18,6 @@ export let share = true; export let sharePublic = true; - let selectedGroupId = ''; - let groups = []; $: if (!sharePublic && accessControl === null) { initPublicAccess(); @@ -41,8 +39,8 @@ } }; + onMount(async () => { - groups = await getGroups(localStorage.token, true); if (accessControl === null) { initPublicAccess(); @@ -144,109 +142,21 @@ {#if share} {#if accessControl !== null} - {@const accessGroups = groups.filter((group) => - (accessControl?.read?.group_ids ?? []).includes(group.id) - )} -
+
- {$i18n.t('Groups')} + {$i18n.t('Add Members')}
- {#if accessGroups.length > 0} -
- {#each accessGroups as group} -
-
-
- {group.name} {group?.member_count} -
-
- -
- - - -
-
- {/each} -
- {/if} - - -
- +
+ +
diff --git a/src/lib/components/workspace/common/MemberSelector.svelte b/src/lib/components/workspace/common/MemberSelector.svelte index 6627ae4459..3a9bac139d 100644 --- a/src/lib/components/workspace/common/MemberSelector.svelte +++ b/src/lib/components/workspace/common/MemberSelector.svelte @@ -16,13 +16,19 @@ import ChevronDown from '$lib/components/icons/ChevronDown.svelte'; import Spinner from '$lib/components/common/Spinner.svelte'; import Checkbox from '$lib/components/common/Checkbox.svelte'; - import { getGroups } from '$lib/apis/groups'; + import Badge from '$lib/components/common/Badge.svelte'; + import { getGroups, getGroupById } from '$lib/apis/groups'; + + export let onChange: Function = () => {}; export let includeGroups = true; export let pagination = false; + export let manageAccess = false; export let groupIds = []; export let userIds = []; + export let accessRoles = ['read']; + export let accessControl = {}; let groups = null; let filteredGroups = []; @@ -31,7 +37,7 @@ ? groups.filter((group) => group.name.toLowerCase().includes(query.toLowerCase())) : []; - let selectedGroup = {}; + let selectedGroups = {}; let selectedUsers = {}; let page = 1; @@ -66,6 +72,10 @@ onMount(async () => { groups = await getGroups(localStorage.token, true); + if(manageAccess){ + userIds = accessControl?.read?.user_ids ?? []; + groupIds = accessControl?.read?.group_ids ?? []; + } if (userIds.length > 0) { userIds.forEach(async (id) => { const res = await getUserById(localStorage.token, id).catch((error) => { @@ -77,6 +87,27 @@ } }); } + if (groupIds.length > 0) { + groupIds.forEach(async (id) => { + const res = await getGroupById(localStorage.token, id).catch((error) => { + console.error(error); + return null; + }); + if (res) { + selectedGroups[id] = res; + // Check if group with this ID already exists in groups array + const existingGroupIndex = groups.findIndex(group => group.id === res.id); + if (existingGroupIndex === -1) { + // If not found, add the new group + groups = [ + ...groups, + res + ]; + } + } + }); + } + console.log(selectedUsers) }); @@ -86,7 +117,7 @@
{:else} - {#if groupIds.length > 0} + {#if groupIds.length > 0 && !manageAccess}
{groupIds.length} @@ -94,18 +125,18 @@
{#each groupIds as id} - {#if selectedGroup[id]} + {#if selectedGroups[id]} @@ -232,27 +302,70 @@ class=" dark:border-gray-850 text-xs flex items-center justify-between w-full" type="button" on:click={() => { - if ((userIds ?? []).includes(user.id)) { - userIds = userIds.filter((id) => id !== user.id); - delete selectedUsers[user.id]; - } else { - userIds = [...userIds, user.id]; - selectedUsers[user.id] = user; - } + if (manageAccess && !accessRoles.includes('write')) { + return + } + + if ((userIds ?? []).includes(user.id)) { + if (!manageAccess || (manageAccess && (accessControl?.write?.user_ids ?? []).includes(user.id))){ + userIds = userIds.filter((id) => id !== user.id); + delete selectedUsers[user.id]; + } + + if(manageAccess){ + if ((accessControl?.write?.user_ids ?? []).includes(user.id)) { + accessControl.write.user_ids = ( + accessControl?.write?.user_ids ?? [] + ).filter((user_id) => user_id !== user.id); + accessControl.read.user_ids = ( + accessControl?.read?.user_ids ?? [] + ).filter((user_id) => user_id !== user.id); + } else { + accessControl.write.user_ids = [ + ...(accessControl?.write?.user_ids ?? []), + user.id + ]; + } + } + } else { + userIds = [...userIds, user.id]; + selectedUsers[user.id] = user; + if(manageAccess){ + accessControl.read.user_ids = [ + ...(accessControl?.read?.user_ids ?? []), + user.id + ]; + } + } + + if(manageAccess){ + onChange(accessControl); + } }} >
- + {#if manageAccess} user - - -
{user.name}
-
+ +
{user.name} {user?.email}
+
+ {:else} + + user + + +
{user.name}
+
+ {/if} {#if user?.is_active}
@@ -270,9 +383,15 @@
- + {#if manageAccess && (accessControl?.write?.user_ids ?? []).includes(user.id)} + + {:else if manageAccess && (accessControl?.read?.user_ids ?? []).includes(user.id)} + + {:else} + + {/if}