|
32 | 32 |
|
33 | 33 | import { userStore, workspaceStore } from '$lib/stores' |
34 | 34 | import { ChevronDown, Loader2, RefreshCcw } from 'lucide-svelte' |
35 | | - import { onDestroy, tick, untrack } from 'svelte' |
| 35 | + import { onDestroy, untrack } from 'svelte' |
36 | 36 | import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte' |
37 | 37 | import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte' |
38 | 38 | import Select from '../select/Select.svelte' |
|
43 | 43 |
|
44 | 44 | let usernames: string[] | undefined = $state() |
45 | 45 | let resources = usePromise(() => loadResources($workspaceStore!), { loadInit: false }) |
46 | | - let page: number | undefined = undefined |
47 | 46 |
|
48 | 47 | interface Props { |
49 | 48 | logs?: AuditLog[] |
|
90 | 89 | } |
91 | 90 | }) |
92 | 91 |
|
93 | | - function updatePerPage(newPerPage: number) { |
94 | | - perPage = newPerPage |
95 | | - } |
96 | | -
|
97 | | - function loadLogs( |
98 | | - username: string | undefined, |
99 | | - page: number | undefined, |
100 | | - perPage: number | undefined, |
101 | | - before: string | undefined, |
102 | | - after: string | undefined, |
103 | | - operation: string | undefined, |
104 | | - resource: string | undefined, |
105 | | - actionKind: ActionKind | undefined | 'all', |
106 | | - scope: undefined | 'all_workspaces' | 'instance' |
107 | | - ) { |
| 92 | + function loadLogs() { |
108 | 93 | loading = true |
109 | 94 |
|
110 | | - if (username == 'all') { |
111 | | - username = undefined |
112 | | - } |
113 | | - if (operation == 'all' || operation == '') { |
114 | | - operation = undefined |
115 | | - } |
116 | | -
|
117 | | - // @ts-ignore |
118 | | - if (actionKind == 'all' || actionKind == '') { |
119 | | - actionKind = undefined |
120 | | - } |
121 | | -
|
122 | | - if (resource == 'all' || resource == '') { |
123 | | - resource = undefined |
124 | | - } |
| 95 | + let username_ = username == 'all' ? undefined : username |
| 96 | + let operation_ = operation == 'all' || operation == '' ? undefined : operation |
| 97 | + let actionKind_ = actionKind == 'all' ? undefined : actionKind |
| 98 | + let resource_ = resource == 'all' || resource == '' ? undefined : resource |
125 | 99 |
|
126 | 100 | let _promise = AuditService.listAuditLogs({ |
127 | 101 | workspace: scope === 'instance' ? 'global' : $workspaceStore!, |
128 | | - page, |
| 102 | + page: pageIndex, |
129 | 103 | perPage, |
130 | 104 | before, |
131 | 105 | after, |
132 | | - username, |
133 | | - operation, |
134 | | - resource, |
135 | | - actionKind, |
| 106 | + username: username_, |
| 107 | + operation: operation_, |
| 108 | + resource: resource_, |
| 109 | + actionKind: actionKind_, |
136 | 110 | allWorkspaces: scope === 'all_workspaces' |
137 | 111 | }) |
138 | 112 | let promise = CancelablePromiseUtils.map(_promise, (value) => { |
139 | 113 | logs = value |
140 | 114 | hasMore = !logs || (logs.length > 0 && logs.length === perPage) |
| 115 | + loading = false |
141 | 116 | }) |
142 | | - promise = CancelablePromiseUtils.onTimeout(promise, 1000, () => { |
143 | | - sendUserToast('Loading audit logs is taking longer than expected...', true, [ |
144 | | - { |
145 | | - label: 'Reduce to 25 items per page', |
146 | | - callback: () => { |
147 | | - _promise.cancel() |
148 | | - updatePerPage(25) |
149 | | - } |
150 | | - } |
151 | | - ]) |
| 117 | + console.log('loadLogs:') |
| 118 | + promise = CancelablePromiseUtils.onTimeout(promise, 4000, () => { |
| 119 | + sendUserToast( |
| 120 | + 'Loading audit logs is taking longer than expected...', |
| 121 | + true, |
| 122 | + perPage > 25 |
| 123 | + ? [{ label: 'Reduce to 25 items per page', callback: () => (perPage = 25) }] |
| 124 | + : [] |
| 125 | + ) |
152 | 126 | }) |
153 | 127 | promise = CancelablePromiseUtils.catchErr(promise, (e) => { |
154 | 128 | if (e instanceof CancelError) return CancelablePromiseUtils.pure<void>(undefined) |
155 | 129 | return CancelablePromiseUtils.pureErr<void>(e) |
156 | 130 | }) |
157 | | - promise = CancelablePromiseUtils.finallyDo(promise, () => { |
158 | | - loading = false |
159 | | - }) |
160 | 131 | return promise |
161 | 132 | } |
162 | 133 |
|
|
167 | 138 | : [$userStore?.username ?? ''] |
168 | 139 | } |
169 | 140 |
|
170 | | - let initialLoad = true |
171 | | - function refreshLogs() { |
172 | | - loadUsers() |
173 | | - resources.refresh() |
174 | | - return loadLogs(username, page, perPage, before, after, operation, resource, actionKind, scope) |
175 | | - } |
176 | | -
|
177 | | - function updateLogs() { |
| 141 | + function updateQueryParams() { |
178 | 142 | const queryParams: string[] = [] |
179 | 143 |
|
180 | 144 | function addQueryParam(key: string, value: string | number | undefined | null) { |
|
184 | 148 | } |
185 | 149 |
|
186 | 150 | addQueryParam('username', username) |
187 | | - addQueryParam('page', page) |
| 151 | + addQueryParam('page', pageIndex) |
188 | 152 | addQueryParam('perPage', perPage) |
189 | 153 | addQueryParam('before', before) |
190 | 154 | addQueryParam('after', after) |
|
197 | 161 | } |
198 | 162 | const query = '?' + queryParams.join('&') |
199 | 163 | goto(query, { replaceState: true, keepFocus: true }) |
200 | | -
|
201 | | - return loadLogs(username, page, perPage, before, after, operation, resource, actionKind, scope) |
202 | | - } |
203 | | -
|
204 | | - function updateQueryParams() { |
205 | | - if (initialLoad) return |
206 | | - page = 1 |
207 | | - pageIndex = 1 |
208 | | -
|
209 | | - return updateLogs() |
210 | | - } |
211 | | -
|
212 | | - function updatePageQueryParams(pageIndex?: number | undefined) { |
213 | | - if (initialLoad) { |
214 | | - return |
215 | | - } |
216 | | - page = pageIndex |
217 | | - updateLogs() |
218 | 164 | } |
219 | 165 |
|
220 | 166 | window.addEventListener('popstate', handlePopState) |
|
331 | 277 | WORKSPACES_DELETE: 'workspaces.delete' |
332 | 278 | } |
333 | 279 |
|
334 | | - let refresh = $state(1) |
335 | | - $effect(() => { |
336 | | - ;[$workspaceStore, refresh] |
337 | | - let promise = untrack(() => refreshLogs()) |
338 | | - tick().then(() => (initialLoad = false)) |
339 | | - return () => promise.cancel() |
340 | | - }) |
| 280 | + let refresh = $state(0) |
| 281 | + let lastRefresh = $state(-1) |
| 282 | +
|
341 | 283 | // observe all the variables that should trigger an update |
342 | 284 | $effect(() => { |
343 | | - ;[username, perPage, before, after, operation, resource, actionKind, scope] |
344 | | - let promise = updateQueryParams() |
345 | | - return () => promise?.cancel() |
346 | | - }) |
347 | | - // observe the pageIndex variable that should trigger an update |
348 | | - $effect(() => { |
349 | | - updatePageQueryParams(pageIndex) |
| 285 | + ;[refresh, username, perPage, before, after, operation, resource, actionKind, scope, pageIndex] |
| 286 | + return untrack(() => { |
| 287 | + if (refresh !== lastRefresh) { |
| 288 | + loadUsers() |
| 289 | + resources.refresh() |
| 290 | + lastRefresh = refresh |
| 291 | + } |
| 292 | + updateQueryParams() |
| 293 | + let promise = loadLogs() |
| 294 | + return () => promise?.cancel() |
| 295 | + }) |
350 | 296 | }) |
351 | 297 | </script> |
352 | 298 |
|
|
0 commit comments