diff --git a/frontend/src/lib/components/auditLogs/AuditLogDetails.svelte b/frontend/src/lib/components/auditLogs/AuditLogDetails.svelte index 392018750d..508543b49b 100644 --- a/frontend/src/lib/components/auditLogs/AuditLogDetails.svelte +++ b/frontend/src/lib/components/auditLogs/AuditLogDetails.svelte @@ -1,14 +1,16 @@ -
+
{#if selectedId} {@const log = logs.find((e) => e.id === selectedId)} {#if log} -
+
+
+ {log.operation} + {displayDate(log.timestamp)} +
+ {#if onClose} +
+
ID {log.id} @@ -49,9 +67,10 @@ {#if log?.parameters?.uuid}
{/if} {:else} - No log selected + No log selected {/if}
diff --git a/frontend/src/lib/components/auditLogs/AuditLogsFilters.svelte b/frontend/src/lib/components/auditLogs/AuditLogsFilters.svelte index 4090a39dbb..9817b667f7 100644 --- a/frontend/src/lib/components/auditLogs/AuditLogsFilters.svelte +++ b/frontend/src/lib/components/auditLogs/AuditLogsFilters.svelte @@ -44,7 +44,6 @@ interface Props { logs?: AuditLog[] username?: string - pageIndex?: number | undefined before?: string | undefined after?: string | undefined perPage?: number | undefined @@ -53,13 +52,14 @@ actionKind?: ActionKind | 'all' scope?: undefined | 'all_workspaces' | 'instance' loading?: boolean + /** Lay the filters out in a row (page header) rather than stacked (popover). */ + inline?: boolean onRefresh?: () => void } let { logs = undefined, username = $bindable('all'), - pageIndex = $bindable(1), before = $bindable(undefined), after = $bindable(undefined), perPage = $bindable(100), @@ -68,6 +68,7 @@ actionKind = $bindable(undefined), scope = $bindable(undefined), loading = false, + inline = false, onRefresh }: Props = $props() @@ -100,7 +101,6 @@ } addQueryParam('username', username) - addQueryParam('page', pageIndex) addQueryParam('perPage', perPage) addQueryParam('before', before) addQueryParam('after', after) @@ -120,7 +120,6 @@ function handlePopState() { const urlSearchParams = new URLSearchParams(window.location.search) username = urlSearchParams.get('username') ?? 'all' - pageIndex = Number(urlSearchParams.get('page')) || 1 before = urlSearchParams.get('before') ?? undefined after = urlSearchParams.get('after') ?? undefined perPage = Number(urlSearchParams.get('perPage')) || 100 @@ -263,12 +262,12 @@ // observe all the variables that should be reflected in the url $effect(() => { - ;[username, perPage, before, after, operation, resource, actionKind, scope, pageIndex] + ;[username, perPage, before, after, operation, resource, actionKind, scope] untrack(() => updateQueryParams()) }) -
+
{#if $workspaceStore == 'admins'}
Scope @@ -406,7 +405,6 @@ username = 'all' operation = 'all' actionKind = 'all' - pageIndex = 1 perPage = 100 resource = 'all' scope = undefined diff --git a/frontend/src/lib/components/auditLogs/AuditLogsTable.svelte b/frontend/src/lib/components/auditLogs/AuditLogsTable.svelte index 372b2aadd3..5c2c140632 100644 --- a/frontend/src/lib/components/auditLogs/AuditLogsTable.svelte +++ b/frontend/src/lib/components/auditLogs/AuditLogsTable.svelte @@ -1,17 +1,16 @@ - computeHeight()} /> - -
-
-
-
ID
-
Timestamp
-
Username
- {#if showWorkspace} -
Workspace
- {/if} -
Operation
-
Resource
-
+
+ +
+
ID
+
Timestamp
+
Username
+ {#if showWorkspace} +
Workspace
+ {/if} +
Operation
+
Resource
- {#if loading} -
- -
- {:else if !logs?.length} -
- No logs found for the selected filters. -
- {:else} - { - if (flatLogs?.[index]?.type === 'date') { - return 33 - } - return 42 - }} - overscanCount={20} - {stickyIndices} - scrollToAlignment="center" - > - {#snippet header()}{/snippet} - {#snippet item({ index, style })} -
- {#if flatLogs} - {@const logOrDate = flatLogs[index]} +
+ {#if loading} +
+ +
+ {:else if !logs?.length} +
+ No logs found for the selected filters. +
+ {:else} + { + if (flatLogs?.[index]?.type === 'date') { + return 33 + } + return 42 + }} + overscanCount={20} + {stickyIndices} + scrollToAlignment="center" + > + {#snippet header()}{/snippet} + {#snippet item({ index, style })} +
+ {#if flatLogs} + {@const logOrDate = flatLogs[index]} - {#if logOrDate} - {#if logOrDate?.type === 'date'} -
- {logOrDate.date} -
- {:else} - - -
{ - onselect?.(logOrDate.log.id) - }} - > -
- {logOrDate.log.id} + {#if logOrDate} + {#if logOrDate?.type === 'date'} +
+ {logOrDate.date}
-
- {displayDate(logOrDate.log.timestamp)} -
-
-
- + +
{ + onselect?.(logOrDate.log.id) + }} + > +
+ {logOrDate.log.id} +
+
+ {displayDate(logOrDate.log.timestamp)} +
+
+
+ -
- - {logOrDate.log.username} - - {#if logOrDate.log.parameters && 'end_user' in logOrDate.log.parameters} - - ({logOrDate.log.parameters.end_user}) +
+ + {logOrDate.log.username} - {/if} + {#if logOrDate.log.parameters && 'end_user' in logOrDate.log.parameters} + + ({logOrDate.log.parameters.end_user}) + + {/if} +
+
+
+ {#if showWorkspace} +
+
+ {logOrDate.log.workspace_id} +
+
+ {/if} +
+
+ { + actionKind = logOrDate.log.action_kind.toLocaleLowerCase() + }} + color={kindToBadgeColor(logOrDate.log.action_kind)} + > + {logOrDate.log.action_kind} + + { + operation = logOrDate.log.operation + }} + > + {logOrDate.log.operation} +
-
-
- {#if showWorkspace}
-
- {logOrDate.log.workspace_id} +
+
+ {logOrDate.log.resource} +
+
- {/if} -
-
- { - actionKind = logOrDate.log.action_kind.toLocaleLowerCase() - }} - color={kindToBadgeColor(logOrDate.log.action_kind)} - > - {logOrDate.log.action_kind} - - { - operation = logOrDate.log.operation - }} - > - {logOrDate.log.operation} - -
-
-
-
-
- {logOrDate.log.resource} -
-
+ {/if} + {:else} +
+
Loading...
{/if} {:else} @@ -291,46 +288,29 @@
Loading...
{/if} - {:else} -
-
Loading...
+
+ {/snippet} + {#snippet footer()} + {#if hasMore && !batchProgress} +
+
{/if} -
- {/snippet} - {#snippet footer()}{/snippet} - - {/if} - + {/snippet} + + {/if} +
-
- - Page {pageIndex} - -
+ {pluralize(logs?.length ?? 0, 'log')} {#if batchProgress}
{/if} -
- Per page: - -
+