fix(preview): Blaettern bleibt bei einer Art Datei

Die Pfeile (und die Pfeiltasten) in der Vorschau liefen bisher ueber
alles Anzeigbare. Wer Bilder durchsah, landete mitten in der Reihe auf
einem PDF -- das ganz anders bedient wird: Seiten statt Dateien, eigene
Zoomleiste, auf schmalen Fenstern gar keine Pfeile.

Jetzt blaettert die Vorschau nur noch durch Dateien derselben Art wie
die gerade offene. Bewusst nicht nur fuer Bilder gesondert geloest,
obwohl es dort auffiel: Dieselbe Ueberraschung gaebe es beim Sprung von
einem PDF in ein Video oder in eine Textdatei.

Solange nichts offen ist, zaehlt weiterhin alles Anzeigbare -- sonst
waere die Liste leer, bevor sie ueberhaupt gebraucht wird.

Nebenwirkung mit Absicht: Gibt es nur ein Bild im Ordner, verschwinden
die Pfeile ganz, statt im Kreis durch fremde Dateitypen zu fuehren.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-09-06 23:16:25 +02:00
1 parent ac61df9796
commit 1e1f35955d
2 files changed
+10 -5

No files matched your search

+1 -1
View File
@@ -53,7 +53,7 @@ type Kind = 'image' | 'pdf' | 'text' | 'video' | 'audio' | 'none'
* 23.08.2026 die Endungen .mp3 und .mp4 nicht kannte. Ohne den Namen ließe
* sich eine vorhandene MP3 also nie abspielen.
*/
function kindOf(mime: string, name = ''): Kind {
export function kindOf(mime: string, name = ''): Kind {
const m = (mime || '').toLowerCase()
// SVG bleibt draußen: Der Server liefert sie nie inline aus, weil eine
// SVG-Datei Skripte enthalten darf.
+9 -4
View File
@@ -8,7 +8,7 @@ import Breadcrumb from '../components/Breadcrumb'
import SearchBox from '../components/SearchBox'
import PageHeader from '../components/PageHeader'
import GridView, { ListView, useCoarsePointer } from '../components/FileViews'
import FilePreview, { canPreview } from '../components/FilePreview'
import FilePreview, { canPreview, kindOf } from '../components/FilePreview'
import ContextMenu, { type MenuItem } from '../components/ContextMenu'
import UploadQueue, { type UploadItem } from '../components/UploadQueue'
import InputDialog from '../components/Dialog'
@@ -339,9 +339,14 @@ export default function FileBrowser({
const sortedFolders = sortFolders(folders, sort)
const sortedFiles = sortFiles(files, sort)
// Blättern in der Vorschau geht nur über das, was sich auch anzeigen lässt –
// sonst landet man mit dem Pfeil auf einer ZIP-Datei und sieht nichts.
const previewable = sortedFiles.filter(canPreview)
// Blättern in der Vorschau bleibt bei **einer** Art Datei: Wer Bilder
// durchsieht, will Bilder sehen und nicht mitten in der Reihe auf einem PDF
// landen, das ganz anders bedient wird (Seiten statt Dateien, eigene
// Zoomleiste). Solange nichts offen ist, zählt weiterhin alles Anzeigbare –
// sonst wäre die Liste leer, bevor sie gebraucht wird.
const previewKind = preview ? kindOf(preview.mime_type, preview.name) : null
const previewable = sortedFiles.filter(f =>
canPreview(f) && (previewKind === null || kindOf(f.mime_type, f.name) === previewKind))
function stepPreview(delta: number) {
if (!preview) return
const i = previewable.findIndex(f => f.id === preview.id)