From 06c427ee39aa07dc42a636194ec2d4ef6cca0239 Mon Sep 17 00:00:00 2001
From: duffyduck
Date: Tue, 19 May 2026 08:20:16 +0200
Subject: [PATCH] =?UTF-8?q?backup-restore:=20Toast=20bei=20Erfolg,=20ausf?=
=?UTF-8?q?=C3=BChrliche=20Fehlermeldung=20im=20Dialog?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Vorher: nach Klick auf "Ja, wiederherstellen" passierte UI-seitig
einfach … nichts Sichtbares außer dass der Dialog (irgendwann) zuging.
Bei einem 500er-Fehler blieb der Dialog offen ohne erkennbare
Begründung – der User dachte, die Aktion sei nicht durchgelaufen,
und klickte teils nochmal.
Jetzt:
- Erfolg → Dialog zu, grüne Toast-Meldung mit der Backend-Response
("X Datensätze und Y Dateien wiederhergestellt"), 6s sichtbar.
- Fehler → Dialog bleibt offen mit roter Detail-Box drinnen,
Backend-Felder error + details zusammengefügt, plus
Toast-Notification 8s. Button-Label wird zu "Erneut versuchen",
Sekundär-Button zu "Schließen".
- Beim Schließen wird mutation.reset() aufgerufen, damit beim
nächsten Öffnen keine alten Fehler dranhängen.
extractError-Helper ist allgemein – kann später für andere
Backup-Aktionen wiederverwendet werden.
Co-Authored-By: Claude Opus 4.7 (1M context)
---
.../src/pages/settings/DatabaseBackup.tsx | 38 +++++++++++++++++--
1 file changed, 35 insertions(+), 3 deletions(-)
diff --git a/frontend/src/pages/settings/DatabaseBackup.tsx b/frontend/src/pages/settings/DatabaseBackup.tsx
index 1d30a8c3..b4077908 100644
--- a/frontend/src/pages/settings/DatabaseBackup.tsx
+++ b/frontend/src/pages/settings/DatabaseBackup.tsx
@@ -1,10 +1,21 @@
import { useState, useRef } from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
+import toast from 'react-hot-toast';
import { Database, Download, Upload, Trash2, RefreshCw, HardDrive, Clock, FileText, FolderOpen, Archive, AlertTriangle, Bomb } from 'lucide-react';
import { backupApi, BackupInfo, getAccessToken } from '../../services/api';
import { useAuth } from '../../context/AuthContext';
import Button from '../../components/ui/Button';
+function extractError(err: any): string {
+ const data = err?.response?.data;
+ if (data) {
+ if (data.error && data.details) return `${data.error}: ${data.details}`;
+ if (data.error) return data.error;
+ if (typeof data === 'string') return data;
+ }
+ return err?.message || 'Unbekannter Fehler';
+}
+
export default function DatabaseBackup() {
const [showRestoreConfirm, setShowRestoreConfirm] = useState(null);
const [showDeleteConfirm, setShowDeleteConfirm] = useState(null);
@@ -34,9 +45,17 @@ export default function DatabaseBackup() {
// Backup wiederherstellen
const restoreMutation = useMutation({
mutationFn: (name: string) => backupApi.restore(name),
- onSuccess: () => {
+ onSuccess: (response: any) => {
queryClient.invalidateQueries({ queryKey: ['backups'] });
setShowRestoreConfirm(null);
+ // Backend liefert message: "X Datensätze und Y Dateien wiederhergestellt"
+ const msg = response?.message || 'Backup erfolgreich wiederhergestellt.';
+ toast.success(msg, { duration: 6000 });
+ },
+ // Bei Fehler bleibt das Dialog absichtlich offen, damit der User
+ // die Detail-Message sehen + ggf. erneut versuchen kann.
+ onError: (err: any) => {
+ toast.error(extractError(err), { duration: 8000 });
},
});
@@ -329,13 +348,24 @@ export default function DatabaseBackup() {
Achtung: Bestehende Daten und Dokumente werden mit dem Backup-Stand überschrieben.
Dies kann nicht rückgängig gemacht werden.
+ {restoreMutation.isError && (
+
+
Wiederherstellung fehlgeschlagen
+
+ {extractError(restoreMutation.error)}
+
+
+ )}
Wird wiederhergestellt...
>
+ ) : restoreMutation.isError ? (
+ 'Erneut versuchen'
) : (
'Ja, wiederherstellen'
)}