feat(nextcloud-files): Dateiansicht mit Ablage-Kacheln, Ziehen und Ablegen und Übertragungsleiste

- Liste als echte Dateitabelle und Raster mit Vorschaubildern; Typkacheln je Dateifamilie (OKLCH-Tokens, Kontrast hell und dunkel per Test geprüft), Ordner im gedämpften Mosaik-Gelb
- Ordnerpfad mit Ablagezielen, Auswahlleiste (klebt beim Scrollen), Tastatur (Enter, Rücktaste/Alt+Pfeil hoch, Entf, F2, Strg+A, Escape), Zeilen- und Rechtsklickmenü
- Dialoge für neuen Ordner, Umbenennen, Verschieben (eigene Ordnerwahl) und Löschen in den Papierkorb
- Ziehen und Ablegen mit Streifen-Markierung und Ordnerzeilen als Ziel, auch ganze Ordner; Übertragungsleiste mit Fortschritt, Abbrechen, Klartextfehlern und Rückfrage bei vergebenem Namen
- Speicheranzeige zählt im Unterordner den Speicher des ganzen Kontos; Ansicht je Benutzer gemerkt

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-08 21:43:46 +02:00
parent 4d4a0b31cb
commit 86fbe8f396
35 changed files with 5575 additions and 11 deletions
@@ -9,6 +9,7 @@ import { getNextcloudFilesStatus, type NextcloudFilesStatus } from '@/lib/nextcl
import { useCanManageModule } from '@/lib/use-module-capability';
import { AccountBar } from './components/AccountBar';
import { ConnectPanel } from './components/ConnectPanel';
import { FileBrowser } from './components/FileBrowser';
import { SettingsTab } from './components/SettingsTab';
type TabId = 'files' | 'settings';
@@ -19,8 +20,9 @@ type TabId = 'files' | 'settings';
* Freigabestufe Verwalten im Reiter "Einstellungen" ein; alle anderen sehen nur
* den Reiter "Dateien" ohne Reiterleiste — bindend ist allein die API. Im
* Abschnitt `nextcloud-files-main` verbindet jeder Benutzer sein eigenes Konto
* (ConnectPanel); ist es verbunden, steht dort der Dateibereich
* (`nextcloud-files-browser`, den die Dateiansicht fuellt).
* (ConnectPanel); ist es verbunden, steht dort die Dateiansicht
* (`nextcloud-files-browser`, FileBrowser). Laeuft die Verbindung ab, laedt die
* Seite den Stand neu und zeigt wieder den Anmeldebildschirm mit Hinweis.
*/
export default function NextcloudFilesPage() {
const t = useTranslations('nextcloudFiles');
@@ -88,9 +90,7 @@ export default function NextcloudFilesPage() {
<section data-testid="nextcloud-files-main" className="space-y-4">
{connected ? (
<div data-testid="nextcloud-files-browser">
<p className="text-sm text-muted-foreground">
{t('main.server', { host: status.host ?? '' })}
</p>
<FileBrowser serverUrl={status.serverUrl} onExpired={() => void reloadStatus()} />
</div>
) : (
<ConnectPanel