diff --git a/frontend/src/lib/components/auditLogs/AuditLogsFilters.svelte b/frontend/src/lib/components/auditLogs/AuditLogsFilters.svelte index 3caa73832f..3bc97538d9 100644 --- a/frontend/src/lib/components/auditLogs/AuditLogsFilters.svelte +++ b/frontend/src/lib/components/auditLogs/AuditLogsFilters.svelte @@ -31,7 +31,7 @@ } from '$lib/gen' import { userStore, workspaceStore } from '$lib/stores' - import { ChevronDown, Loader2, RefreshCcw } from 'lucide-svelte' + import { ChevronDown, Download, Loader2, RefreshCcw } from 'lucide-svelte' import { onDestroy, untrack } from 'svelte' import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte' import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte' @@ -279,6 +279,28 @@ let refresh = $state(0) let lastRefresh = $state(-1) + function downloadAuditLogsAsJson() { + if (!logs || logs.length === 0) { + sendUserToast('No audit logs to download', true) + return + } + + const jsonContent = JSON.stringify(logs, null, 2) + const blob = new Blob([jsonContent], { type: 'application/json' }) + const url = URL.createObjectURL(blob) + + const timestamp = new Date().toISOString().replace(/[:.]/g, '-') + const filename = `audit_logs_${$workspaceStore}_${timestamp}.json` + + const link = document.createElement('a') + link.href = url + link.download = filename + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + URL.revokeObjectURL(url) + } + // observe all the variables that should trigger an update $effect(() => { ;[refresh, username, perPage, before, after, operation, resource, actionKind, scope, pageIndex] @@ -438,6 +460,17 @@ > Clear filters +