feat(nextcloud-files): Nextcloud-Kennung auf der Anmeldeseite, Anleitungen und Changelog

- Anmeldebildschirm zeigt Name, Logo und Themenfarbe der Nextcloud (GET server, server/logo)
- Kennung wird 10 Minuten zwischengespeichert, Adresswechsel leert sie, Logo nur nach Bytes erkannt und mit CSP-Sandbox ausgeliefert
- Anmeldekarte neu gestaltet (Kennungskopf, Hinweis zum Passwort am Fuss), Kontoleiste mit kleiner Kachel
- Fokusfang in leeren Ordnern, damit die Rücktaste dort funktioniert
- Changelog, Anwender-, Administrations- und Betriebshandbuch (Brute-Force-Ausnahme, Proxy-Grenzen)
- e2e-Skripte wiederholbar gemacht

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-08 22:08:57 +02:00
parent 86fbe8f396
commit 630398fe93
24 changed files with 1118 additions and 107 deletions
@@ -5,7 +5,12 @@ import { useCallback, useEffect, useState } from 'react';
import { TabBar } from '@/components/accounting/tab-bar';
import { SettingsSection } from '@/components/control-center/settings-section';
import { PageHeader } from '@/components/layout/page-header';
import { getNextcloudFilesStatus, type NextcloudFilesStatus } from '@/lib/nextcloud-files-api';
import {
getNextcloudFilesStatus,
getServerInfo,
type NextcloudFilesStatus,
type NextcloudServerInfo,
} from '@/lib/nextcloud-files-api';
import { useCanManageModule } from '@/lib/use-module-capability';
import { AccountBar } from './components/AccountBar';
import { ConnectPanel } from './components/ConnectPanel';
@@ -31,6 +36,7 @@ export default function NextcloudFilesPage() {
const [status, setStatus] = useState<NextcloudFilesStatus | null>(null);
const [statusError, setStatusError] = useState(false);
const [tab, setTab] = useState<TabId>('files');
const [serverInfo, setServerInfo] = useState<NextcloudServerInfo | null>(null);
const reloadStatus = useCallback(async () => {
try {
@@ -45,6 +51,29 @@ export default function NextcloudFilesPage() {
void reloadStatus();
}, [reloadStatus]);
// Name, Farbe und Logo der Nextcloud fuer Anmeldebildschirm und Kontoleiste. Ein Fehler ist
// harmlos: ohne Kennung steht der Rechnername da.
const configured = status?.configured === true;
const serverUrl = status?.serverUrl ?? null;
// biome-ignore lint/correctness/useExhaustiveDependencies: eine neue Adresse laedt die Kennung neu
useEffect(() => {
if (!configured) {
setServerInfo(null);
return;
}
let cancelled = false;
getServerInfo()
.then((info) => {
if (!cancelled) setServerInfo(info);
})
.catch(() => {
if (!cancelled) setServerInfo(null);
});
return () => {
cancelled = true;
};
}, [configured, serverUrl]);
const account = status?.account ?? null;
const connected = account?.connected === true;
@@ -60,7 +89,12 @@ export default function NextcloudFilesPage() {
description={t('description')}
actions={
activeTab === 'files' && status?.configured && account && connected ? (
<AccountBar account={account} host={status.host} onDisconnected={reloadStatus} />
<AccountBar
account={account}
host={status.host}
info={serverInfo}
onDisconnected={reloadStatus}
/>
) : undefined
}
/>
@@ -95,6 +129,7 @@ export default function NextcloudFilesPage() {
) : (
<ConnectPanel
host={status.host}
info={serverInfo}
expired={account?.expired === true}
onConnected={reloadStatus}
/>