Skip to content

Commit ce28453

Browse files
committed
Show user sync runs
1 parent e8c2bda commit ce28453

File tree

3 files changed

+117
-11
lines changed

3 files changed

+117
-11
lines changed

src/routes/admin/+page.gql

-11
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,4 @@
11
query AdminUsers($limit: Int, $offset: Int) {
2-
userSync {
3-
startedAt
4-
finishedAt
5-
auditLogs(limit: 15) {
6-
nodes {
7-
actor
8-
message
9-
createdAt
10-
}
11-
}
12-
}
132
users(limit: $limit, offset: $offset) {
143
nodes {
154
name

src/routes/admin/+page.svelte

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import { changeParams, limitOffset } from '$lib/pagination';
66
import { Button, Table, Tbody, Td, Th, Thead, Tr } from '@nais/ds-svelte-community';
77
import type { PageData } from './$houdini';
8+
import SyncRuns from './SyncRuns.svelte';
89
910
export let data: PageData;
1011
@@ -43,6 +44,12 @@
4344
{/each}
4445

4546
<Card>
47+
<h2>User sync logs</h2>
48+
<SyncRuns />
49+
</Card>
50+
<br />
51+
<Card>
52+
<h2>Users</h2>
4653
{#if $AdminUsers.data}
4754
<Table zebraStripes>
4855
<Thead>

src/routes/admin/SyncRuns.svelte

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<script lang="ts">
2+
import { graphql, UserSyncRunStatus } from '$houdini';
3+
import GraphErrors from '$lib/GraphErrors.svelte';
4+
import Time from '$lib/Time.svelte';
5+
import { Accordion, AccordionItem, Loader } from '@nais/ds-svelte-community';
6+
import format from 'date-fns/format';
7+
import formatDistance from 'date-fns/formatDistance';
8+
import enGB from 'date-fns/locale/en-GB';
9+
10+
const runs = graphql(`
11+
query UserSyncRuns @load {
12+
userSync {
13+
startedAt
14+
finishedAt
15+
status
16+
error
17+
auditLogs(limit: 15) {
18+
nodes {
19+
actor
20+
message
21+
createdAt
22+
}
23+
}
24+
}
25+
}
26+
`);
27+
</script>
28+
29+
<div class="wrapper">
30+
{#if $runs.fetching}
31+
<p><Loader size="xlarge" /></p>
32+
{:else}
33+
{#if $runs.errors}
34+
<GraphErrors errors={$runs.errors} />
35+
{/if}
36+
37+
{#each $runs.data?.userSync || [] as us}
38+
<div
39+
class="run"
40+
class:ok={us.status == UserSyncRunStatus.SUCCESS}
41+
class:pending={us.status == UserSyncRunStatus.IN_PROGRESS}
42+
class:error={us.status == UserSyncRunStatus.FAILURE}
43+
>
44+
Started <Time time={us.startedAt} distance={true} />.
45+
{#if us.finishedAt}
46+
{#if us.status == UserSyncRunStatus.FAILURE}
47+
Failed after
48+
{:else}
49+
Finished after
50+
{/if}
51+
<time
52+
datetime={us.finishedAt.toTimeString()}
53+
title={format(us.finishedAt, 'dd. MMMM yyyy HH:mm:ss', { locale: enGB })}
54+
>
55+
{formatDistance(us.startedAt, us.finishedAt, { includeSeconds: true })}.
56+
</time>
57+
{/if}
58+
{#if us.error}
59+
<pre>{us.error}</pre>
60+
{/if}
61+
{#if us.auditLogs.nodes.length > 0}
62+
<Accordion>
63+
<AccordionItem>
64+
<svelte:fragment slot="heading">
65+
<h2>View logs</h2>
66+
</svelte:fragment>
67+
{#each us.auditLogs.nodes as log}
68+
<p>{log.actor} - {log.message} - {log.createdAt}</p>
69+
{/each}
70+
</AccordionItem>
71+
</Accordion>
72+
{/if}
73+
</div>
74+
{/each}
75+
{/if}
76+
</div>
77+
78+
<style>
79+
.wrapper {
80+
display: flex;
81+
flex-direction: column;
82+
}
83+
84+
.run {
85+
margin-bottom: 1rem;
86+
border: 1px solid #d6d8db;
87+
border-left: 0.7rem solid #d6d8db;
88+
padding: 0.5rem;
89+
}
90+
91+
.run.ok {
92+
border-color: var(--a-surface-success);
93+
}
94+
95+
.run.pending {
96+
border-color: var(--a-surface-neutral);
97+
}
98+
99+
.run.error {
100+
border-color: var(--a-surface-danger);
101+
}
102+
103+
pre {
104+
font-size: 0.8rem;
105+
}
106+
107+
.run :global(time) {
108+
border-bottom: 1px dotted var(--a-border-default);
109+
}
110+
</style>

0 commit comments

Comments
 (0)