Skip to content

Commit 3486740

Browse files
committed
Use aggregations for stack card data.
1 parent 3042460 commit 3486740

File tree

1 file changed

+41
-8
lines changed
  • src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components

1 file changed

+41
-8
lines changed

src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/StackCard.svelte

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import ClickableStringFilter from '$comp/filters/ClickableStringFilter.svelte';
55
import DateTime from '$comp/formatters/DateTime.svelte';
66
import Number from '$comp/formatters/Number.svelte';
7+
import Percentage from '$comp/formatters/Percentage.svelte';
78
import TimeAgo from '$comp/formatters/TimeAgo.svelte';
89
import Muted from '$comp/typography/Muted.svelte';
910
import { Badge } from '$comp/ui/badge';
1011
import { Button } from '$comp/ui/button';
1112
import * as Card from '$comp/ui/card';
1213
import * as Tooltip from '$comp/ui/tooltip';
14+
import { getProjectCountQuery, getStackCountQuery } from '$features/events/api.svelte';
15+
import { DEFAULT_OFFSET } from '$features/shared/api/api.svelte';
1316
import { getStackQuery } from '$features/stacks/api.svelte';
17+
import { cardinality, max, min, sum } from '$shared/api/aggregations';
1418
import IconFirstOccurrence from '~icons/mdi/arrow-left-circle';
1519
import IconLastOccurrence from '~icons/mdi/arrow-right-circle';
1620
import IconCalendar from '~icons/mdi/calendar';
@@ -30,15 +34,44 @@
3034
3135
let { changed, id }: Props = $props();
3236
33-
let stackResponse = getStackQuery({
37+
const stackResponse = getStackQuery({
3438
route: {
3539
get id() {
3640
return id;
3741
}
3842
}
3943
});
4044
45+
const projectCountResponse = getProjectCountQuery({
46+
params: {
47+
aggregations: 'cardinality:user'
48+
},
49+
route: {
50+
get projectId() {
51+
return stackResponse.data?.project_id;
52+
}
53+
}
54+
});
55+
56+
// TODO: Add stack charts for Occurrences, Average Value, Value Sum
57+
const stackCountResponse = getStackCountQuery({
58+
params: {
59+
aggregations: `date:(date${DEFAULT_OFFSET ? '^' + DEFAULT_OFFSET : ''} cardinality:user sum:count~1) min:date max:date cardinality:user sum:count~1`
60+
},
61+
route: {
62+
get stackId() {
63+
return id;
64+
}
65+
}
66+
});
67+
4168
const stack = $derived(stackResponse.data!);
69+
const eventOccurrences = $derived(sum(stackCountResponse?.data?.aggregations, 'sum_count')?.value ?? 0);
70+
const totalOccurrences = $derived(stack && stack.total_occurrences > eventOccurrences ? stack.total_occurrences : eventOccurrences);
71+
const userCount = $derived(sum(stackCountResponse?.data?.aggregations, 'cardinality_user')?.value ?? 0);
72+
const totalUserCount = $derived(cardinality(projectCountResponse?.data?.aggregations, 'cardinality_user')?.value ?? 0);
73+
const firstOccurrence = $derived(min<string>(stackCountResponse?.data?.aggregations, 'min_date')?.value ?? stack?.first_occurrence);
74+
const lastOccurrence = $derived(max<string>(stackCountResponse?.data?.aggregations, 'max_date')?.value ?? stack?.last_occurrence);
4275
</script>
4376

4477
{#if stack}
@@ -62,25 +95,25 @@
6295
<Tooltip.Root>
6396
<Tooltip.Trigger class="flex flex-col items-center rounded-lg bg-muted p-2">
6497
<IconCalendar class="mb-1 size-6 text-primary" />
65-
<span class="text-lg font-bold"><Number value={stack.total_occurrences} /></span>
98+
<span class="text-lg font-bold"><Number value={totalOccurrences} /></span>
6699
<Muted>Total Events</Muted>
67100
</Tooltip.Trigger>
68101
<Tooltip.Content side="bottom">
69-
<Number value={stack.total_occurrences} /> All Time
102+
<Number value={totalOccurrences} /> All Time
70103
</Tooltip.Content>
71104
</Tooltip.Root>
72105
<Tooltip.Root>
73106
<Tooltip.Trigger class="flex flex-col items-center rounded-lg bg-muted p-2">
74107
<IconUsers class="mb-1 size-6 text-primary" />
75-
<span class="text-lg font-bold"><Number value={12345} /></span>
108+
<span class="text-lg font-bold"><Percentage percent={(userCount / totalUserCount) * 100.0} /></span>
76109
<Muted>Users Affected</Muted>
77110
</Tooltip.Trigger>
78-
<Tooltip.Content side="bottom">Users Affected</Tooltip.Content>
111+
<Tooltip.Content side="bottom"><Number value={userCount} /> of <Number value={totalUserCount} /> Users Affected</Tooltip.Content>
79112
</Tooltip.Root>
80113
<Tooltip.Root>
81114
<Tooltip.Trigger class="flex flex-col items-center rounded-lg bg-muted p-2">
82115
<IconFirstOccurrence class="mb-1 size-6 text-muted-foreground" />
83-
<span class="text-lg font-bold"><TimeAgo value={stack.first_occurrence} /></span>
116+
<span class="text-lg font-bold"><TimeAgo value={firstOccurrence} /></span>
84117
<Muted>First</Muted>
85118
</Tooltip.Trigger>
86119
<Tooltip.Content side="bottom">
@@ -90,11 +123,11 @@
90123
<Tooltip.Root>
91124
<Tooltip.Trigger class="flex flex-col items-center rounded-lg bg-muted p-2">
92125
<IconLastOccurrence class="mb-1 size-6 text-muted-foreground" />
93-
<span class="text-lg font-bold"><TimeAgo value={stack.last_occurrence} /></span>
126+
<span class="text-lg font-bold"><TimeAgo value={lastOccurrence} /></span>
94127
<Muted>Last</Muted>
95128
</Tooltip.Trigger>
96129
<Tooltip.Content side="bottom">
97-
Last Occurred On <DateTime value={stack.last_occurrence} />
130+
Last Occurred On <DateTime value={lastOccurrence} />
98131
</Tooltip.Content>
99132
</Tooltip.Root>
100133
</div>

0 commit comments

Comments
 (0)