revert(frontend): Frontend auf letzten funktionierenden Stand 5680179 zurückgesetzt — i18n-Massen-Batch brach Dashboard-Shell in Produktion; Render-Loop-Fix und DSGVO-Antrags-UI liegen sicher in Historie für kontrollierten Wiedereinspiel

This commit is contained in:
Agent Zero
2026-08-27 09:14:21 +02:00
parent bea479bfad
commit 66c11d3d64
119 changed files with 925 additions and 1477 deletions
@@ -45,7 +45,6 @@ describe('Automation API Hooks', () => {
return { data: [], isLoading: false };
});
mockApiGet.mockResolvedValue([]);
useAutomations();
expect(mockApiGet).toHaveBeenCalledWith('/automation');
});
@@ -62,7 +61,6 @@ describe('Automation API Hooks', () => {
return { data: [], isLoading: false };
});
mockApiGet.mockResolvedValue([]);
useAgents();
expect(mockApiGet).toHaveBeenCalledWith('/agents');
});
-38
View File
@@ -145,41 +145,3 @@ export async function updateRetentionPolicy(
{ days }
);
}
// ─── DSAR (GDPR Art. 15/17/20) ───
export type DsarType = 'access' | 'deletion' | 'rectification';
export interface DsarRequestResponse {
job_id: string;
status: string;
type: DsarType;
user_id: string;
}
/** Queue a DSAR job for a user. Admin only. */
export async function submitDsarRequest(
userId: string,
type: DsarType
): Promise<DsarRequestResponse> {
return apiPost<DsarRequestResponse>(`/system-settings/dsar/${userId}`, {
type,
});
}
/** Stream the full GDPR data export for a user and trigger a browser download. */
export async function downloadDsgvoExport(userId: string, userName?: string): Promise<void> {
const response = await apiGet<Blob>(`/system-settings/dsgvo-export/${userId}`, {
responseType: 'blob',
});
const blob = new Blob([response], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
const safeName = (userName ?? userId).replace(/[^a-z0-9_-]/gi, '_');
link.download = `dsgvo_export_${safeName}.json`;
document.body.appendChild(link);
link.click();
link.remove();
URL.revokeObjectURL(url);
}