diff --git a/src/lib/components/workspace/common/AccessControl.svelte b/src/lib/components/workspace/common/AccessControl.svelte index 275d9e35b7..113fd9bdcf 100644 --- a/src/lib/components/workspace/common/AccessControl.svelte +++ b/src/lib/components/workspace/common/AccessControl.svelte @@ -3,8 +3,9 @@ const i18n = getContext('i18n'); + import { user as sessionUser } from '$lib/stores'; import { getGroups, getGroupById, getGroupInfoById } from '$lib/apis/groups'; - import { getUserInfoById } from '$lib/apis/users'; + import { getUserInfoById, searchUsers } from '$lib/apis/users'; import { WEBUI_API_BASE_URL } from '$lib/constants'; import XMark from '$lib/components/icons/XMark.svelte'; import Badge from '$lib/components/common/Badge.svelte'; @@ -40,6 +41,7 @@ export let defaultPermission: 'read' | 'write' = 'read'; let groups: any[] = []; + let userTotal: number | null = null; const resolvingGroupIds = new Set(); let userById: Record = {}; const resolvingUserIds = new Set(); @@ -428,6 +430,20 @@ .filter((group) => readGroupIds.includes(group.id) || writeGroupIds.includes(group.id)) .sort((a, b) => a.name.localeCompare(b.name)); + $: selectableGroupCount = allowGroups + ? groups.filter( + (group) => !readGroupIds.includes(group.id) && !writeGroupIds.includes(group.id) + ).length + : 0; + + $: selectableUserCount = + shareUsers && userTotal !== null + ? Math.max(0, userTotal - 1 - selectedUserIds.filter((id) => id !== $sessionUser?.id).length) + : 0; + + $: canAddAccess = + selectableGroupCount > 0 || (shareUsers && userTotal === null) || selectableUserCount > 0; + $: if (selectedUserIds.length > 0) { void ensureUsersByIds(selectedUserIds); } @@ -464,6 +480,14 @@ groups = [...groups, ...res].filter( (g, index, self) => index === self.findIndex((t) => t.id === g.id) ); + + if (shareUsers) { + const userRes = await searchUsers(localStorage.token, '', 'name', 'asc', 1).catch((error) => { + console.error(error); + return null; + }); + userTotal = userRes?.total ?? null; + } }); @@ -571,16 +595,18 @@ {$i18n.t('Access List')}
- + {#if canAddAccess} + + {/if}
diff --git a/src/lib/components/workspace/common/MemberSelector.svelte b/src/lib/components/workspace/common/MemberSelector.svelte index f90a1528b3..6a4cf47346 100644 --- a/src/lib/components/workspace/common/MemberSelector.svelte +++ b/src/lib/components/workspace/common/MemberSelector.svelte @@ -31,9 +31,23 @@ let filteredGroups = []; $: filteredGroups = groups - ? groups.filter((group) => group.name.toLowerCase().includes(query.toLowerCase())) + ? groups.filter( + (group) => + group.name.toLowerCase().includes(query.toLowerCase()) && + !accessGrants.some( + (grant) => grant.principal_type === 'group' && grant.principal_id === group.id + ) + ) : []; + $: filteredUsers = (users ?? []).filter( + (user: any) => + !accessGrants.some( + (grant) => grant.principal_type === 'user' && grant.principal_id === user.id + ) && + (includeSessionUser || user?.id !== $_user?.id) + ); + let selectedGroup = {}; let selectedUsers = {}; @@ -195,7 +209,7 @@ - {#if users.length > 0 || filteredGroups.length > 0} + {#if filteredUsers.length > 0 || filteredGroups.length > 0}
@@ -241,64 +255,61 @@
{/if} - {#if includeUsers} + {#if includeUsers && filteredUsers.length > 0}
{$i18n.t('Users')}
- {#each users as user, userIdx (user.id)} - {#if !accessGrants.some((grant) => grant.principal_type === 'user' && grant.principal_id === user.id) && (includeSessionUser || user?.id !== $_user?.id)} - - {/if} +
+ +
+
+ +
+
+ {/each}
{/if}