{#snippet expiryChip(value: string | null, onchange: (v: string | null) => void)} {#if value} onchange((e.currentTarget as HTMLInputElement).value || null)} aria-label={t('share.expiry', 'Expiry')} /> {:else} {/if} {/snippet}
{#if allowLinks}
{/if} {#if tab === 'people'} {#if !directoryAvailable && !grantsLoading}

{t('share.directoryUnavailable', 'User directory unavailable')}

{:else}
{@render expiryChip(newExpiry, (v) => (newExpiry = v))}
{/if} {#if grantsLoading} {:else if members.length === 0}

{t('share.no_people', 'Not shared with anyone yet.')}

{:else} {#each memberGroups as group (group.role)}
{roleLabel(group.role)} {group.members.length}
    {#each group.members as m (m.subject.type + m.subject.id)}
  • {#if m.subject.type === 'user'} {:else} {m.recipient.label} {#if m.recipient.sublabel}{m.recipient.sublabel}{/if} {/if} {@render expiryChip(m.expiry, (v) => changeMemberExpiry(m, v))}
  • {/each}
{/each} {/if} {:else}
{#if linkLoading} {:else if shares.length === 0}

{t('share.none', 'No public links yet.')}

{:else} {/if} {/if}
{#snippet footer()} {/snippet}