diff --git a/frontend/src/lib/components/GroupVignette.svelte b/frontend/src/lib/components/GroupVignette.svelte
new file mode 100644
index 00000000..7aa5bf37
--- /dev/null
+++ b/frontend/src/lib/components/GroupVignette.svelte
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+ {label}
+ {#if sublabel}{sublabel}{/if}
+
+
+
+
diff --git a/frontend/src/routes/config/drive/[uuid]/+page.svelte b/frontend/src/routes/config/drive/[uuid]/+page.svelte
index ffc1a8b7..b72e8623 100644
--- a/frontend/src/routes/config/drive/[uuid]/+page.svelte
+++ b/frontend/src/routes/config/drive/[uuid]/+page.svelte
@@ -14,6 +14,8 @@
import ReadOnlyBanner from '$lib/components/ReadOnlyBanner.svelte';
import ShareDialog from '$lib/components/ShareDialog.svelte';
import UserVignette from '$lib/components/UserVignette.svelte';
+ import GroupVignette from '$lib/components/GroupVignette.svelte';
+ import { ensureResolvers } from '$lib/api/endpoints/recipients';
import Icon from '$lib/icons/Icon.svelte';
import { t } from '$lib/i18n/index.svelte';
import { drives as drivesStore, driveIcon } from '$lib/stores/drives.svelte';
@@ -192,6 +194,10 @@
onMount(() => {
void drivesStore.load();
+ // Preload the recipient caches (users + groups) so the members
+ // list can render group names + user labels synchronously. Both
+ // caches are module-level and shared across surfaces.
+ void ensureResolvers();
});
// SvelteKit reuses this component when navigating between
@@ -368,10 +374,7 @@
{#if m.subject.type === 'user'}
{:else if m.subject.type === 'group'}
-
-
- {m.subject.id}
-
+
{:else}