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
+