{#each directories as dir (dir.id)}
onNavigateDirectory(id)} onRename={(id, name) => onRenameDirectory(id, name)} onDelete={(id) => onDeleteDirectory(id)} onFileDrop={(fileId, directoryId) => onMoveFileToDirectory(fileId, directoryId)} onDirDrop={(dirId, targetId) => onMoveDirectoryToDirectory(dirId, targetId)} /> {/each} {#each files as file (file?.id ?? file?.itemId ?? file?.tempId)}
{ const fileId = file?.id ?? file?.tempId; if (fileId) { e.dataTransfer?.setData('application/x-kb-file-move', JSON.stringify({ fileId })); } }} >
{#if file?.status !== 'uploading'}
{ let fileId = file?.id ?? file?.tempId; onClick(fileId); }} >
{:else}
{/if}
{ onClick(file?.id ?? file?.tempId); }} on:dblclick={() => { if (knowledge?.write_access) startRename(file); }} >
{#if editingFileId === (file?.id ?? file?.tempId)}
{ if (e.key === 'Enter') submitRename(); if (e.key === 'Escape') cancelRename(); }} on:blur={submitRename} on:click={(e) => e.stopPropagation()} autofocus /> {:else}
{file?.name ?? file?.meta?.name} {#if file?.meta?.size}
{formatFileSize(file?.meta?.size)}
{/if}
{/if}
{#if file?.updated_at}
{dayjs(file.updated_at * 1000).fromNow()}
{/if} {#if file?.user}
{$i18n.t('By {{name}}', { name: capitalizeFirstLetter( file?.user?.name ?? file?.user?.email ?? $i18n.t('Deleted User') ) })}
{/if}
{#if knowledge?.write_access}
{ startRename(file); }} >
{$i18n.t('Rename')}
{ let fileId = file?.id ?? file?.tempId; window.open(`${WEBUI_BASE_URL}/api/v1/files/${fileId}/content`, '_blank'); }} >
{$i18n.t('Download')}
{ onDelete(file?.id ?? file?.tempId); }} >
{$i18n.t('Delete')}
{/if}
{/each}