=> {
+ try {
+ removeOptimistically(mandateId);
+ await hardDeleteMandateApi(request, mandateId, confirmName);
+ return true;
+ } catch (error: any) {
+ console.error('Error hard-deleting mandate:', error);
+ await fetchMandates();
+ return false;
+ }
+ }, [request, fetchMandates]);
+
// Inline update
const handleInlineUpdate = useCallback(async (
mandateId: string,
@@ -231,6 +245,7 @@ export function useAdminMandates() {
handleCreate,
handleUpdate,
handleDelete,
+ handleHardDelete,
handleInlineUpdate,
updateOptimistically,
};
diff --git a/src/pages/admin/AdminMandatesPage.tsx b/src/pages/admin/AdminMandatesPage.tsx
index cac150a..0ba5b04 100644
--- a/src/pages/admin/AdminMandatesPage.tsx
+++ b/src/pages/admin/AdminMandatesPage.tsx
@@ -17,7 +17,7 @@ import { useToast } from '../../contexts/ToastContext';
import { usePrompt } from '../../hooks/usePrompt';
import { FormGeneratorTable } from '../../components/FormGenerator/FormGeneratorTable';
import { FormGeneratorForm } from '../../components/FormGenerator/FormGeneratorForm';
-import { FaPlus, FaSync, FaBuilding, FaUsers, FaLock } from 'react-icons/fa';
+import { FaPlus, FaSync, FaBuilding, FaUsers, FaLock, FaSkullCrossbones } from 'react-icons/fa';
import styles from './Admin.module.css';
export const AdminMandatesPage: React.FC = () => {
@@ -37,6 +37,7 @@ export const AdminMandatesPage: React.FC = () => {
handleCreate,
handleUpdate,
handleDelete,
+ handleHardDelete,
handleInlineUpdate,
updateOptimistically,
} = useAdminMandates();
@@ -118,17 +119,37 @@ export const AdminMandatesPage: React.FC = () => {
return;
}
const entered = await prompt(
- `Um den Mandanten "${mandate.name}" unwiderruflich zu löschen, geben Sie den Namen ein:`,
- { title: 'Mandant löschen', confirmLabel: 'Löschen', variant: 'danger', placeholder: mandate.name },
+ `Um den Mandanten "${mandate.name}" zu deaktivieren (Soft-Delete), geben Sie den Namen ein:`,
+ { title: 'Mandant deaktivieren', confirmLabel: 'Deaktivieren', variant: 'danger', placeholder: mandate.name },
);
if (entered === null) return;
if (entered !== mandate.name) {
- showWarning('Löschung abgebrochen', 'Der eingegebene Name stimmt nicht überein.');
+ showWarning('Abgebrochen', 'Der eingegebene Name stimmt nicht überein.');
return;
}
await handleDelete(mandate.id);
};
+ const handleHardDeleteMandate = async (mandate: Mandate) => {
+ if (mandate.isSystem) {
+ showWarning('Nicht erlaubt', 'System-Mandanten können nicht gelöscht werden.');
+ return;
+ }
+ const entered = await prompt(
+ `ACHTUNG: Dies löscht den Mandanten "${mandate.name}" unwiderruflich inkl. aller Subscriptions, Features, Benutzer-Zuweisungen und Daten. Geben Sie den exakten Namen ein:`,
+ { title: 'Hard Delete (irreversibel)', confirmLabel: 'Endgültig löschen', variant: 'danger', placeholder: mandate.name },
+ );
+ if (entered === null) return;
+ if (entered !== mandate.name) {
+ showWarning('Abgebrochen', 'Der eingegebene Name stimmt nicht überein.');
+ return;
+ }
+ const ok = await handleHardDelete(mandate.id, entered);
+ if (ok) {
+ showSuccess('Gelöscht', `Mandant "${mandate.name}" wurde endgültig gelöscht.`);
+ }
+ };
+
if (error) {
return (
@@ -218,12 +239,21 @@ export const AdminMandatesPage: React.FC = () => {
}] : []),
...(canDelete ? [{
type: 'delete' as const,
- title: 'Löschen',
+ title: 'Deaktivieren (Soft-Delete)',
disabled: (row: Mandate) => row.isSystem
? { disabled: true, message: 'System-Mandanten können nicht gelöscht werden' }
: false
}] : []),
]}
+ customActions={canDelete ? [{
+ id: 'hard-delete',
+ icon: ,
+ onClick: handleHardDeleteMandate,
+ title: 'Hard Delete (irreversibel)',
+ disabled: (row: Mandate) => row.isSystem
+ ? { disabled: true, message: 'System-Mandanten können nicht gelöscht werden' }
+ : false,
+ }] : []}
onDelete={handleDeleteMandate}
hookData={{
refetch,