Files | Tanabata
0 || filterOpen} onSortChange={(s) => fileSorting.setSort(s as FileSortField)} onOrderToggle={() => fileSorting.toggleOrder()} onFilterToggle={() => (filterOpen = !filterOpen)} onUpload={() => uploader?.open()} onTrash={() => goto('/files/trash')} /> {#if filterOpen} (filterOpen = false)} /> {/if}
{#if error} {/if}
{#each files as file, i (file.id)} handleTap(file, i, e)} onLongPress={(pt) => handleLongPress(file, i, pt)} /> {/each}
{#if !loading && !hasMore && files.length === 0}
No files yet.
{/if}
{#if $selectionActive} (tagEditorOpen = true)} onAddToPool={openPoolPicker} onDelete={() => (confirmDeleteFiles = true)} /> {/if} {#if tagEditorOpen} {/if} {#if poolPickerOpen} {/if} {#if confirmDeleteFiles} { const ids = [...$selectionStore.ids]; confirmDeleteFiles = false; selectionStore.exit(); try { await api.post('/files/bulk/delete', { file_ids: ids }); files = files.filter((f) => !ids.includes(f.id ?? '')); } catch { // silently ignore — file list already updated optimistically } }} onCancel={() => (confirmDeleteFiles = false)} /> {/if}