|
1 | 1 | <script lang="ts"> |
2 | 2 | import Spinner from './Icons/Spinner.svelte'; |
3 | 3 | import ExclamationMark from './Icons/ExclamationMark.svelte'; |
4 | | - import { type ProgressData, type Column } from '$lib/types'; |
| 4 | + import { type ProgressData, type Column, type RawData } from '$lib/types'; |
5 | 5 | import Table from '$lib/Table.svelte'; |
6 | 6 | import { t, config } from './config'; |
7 | 7 | import ErrorBanner from '$lib/ErrorBanner.svelte'; |
|
20 | 20 | let size: number = $state(parseInt(page_size)); |
21 | 21 | let page: number = $state(getCurrentPage()); |
22 | 22 |
|
| 23 | + function parseInteger(int: string | null): number | null { |
| 24 | + if (int) { |
| 25 | + return Number(int); |
| 26 | + } |
| 27 | + return null; |
| 28 | + } |
| 29 | +
|
23 | 30 | function getCurrentPage(): number { |
24 | 31 | const url = new URL(document.location.href); |
25 | | - const page = Number(url.searchParams.get('page')) || null; |
| 32 | + const page = parseInteger(url.searchParams.get('page')); |
26 | 33 | return page ?? 1; |
27 | 34 | } |
28 | 35 | function getCurrentFilter(): number | null { |
29 | 36 | const url = new URL(document.location.href); |
30 | | - const failedAt = Number(url.searchParams.get('failed_at')) || null; |
31 | | - return failedAt ?? null; |
| 37 | + const failedAt = parseInteger(url.searchParams.get('failed_at')); |
| 38 | + return failedAt; |
32 | 39 | } |
33 | 40 |
|
34 | 41 | function updateUrl(): void { |
|
57 | 64 | url.searchParams.set('size', String(size)); |
58 | 65 | fetch(url.toString()) |
59 | 66 | .then((response) => response.json()) |
60 | | - .then(({ data: recievedData, meta }) => { |
| 67 | + .then(({ data: recievedData, meta }: { data: ProgressData | null; meta: RawData }) => { |
61 | 68 | if (recievedData) { |
62 | 69 | total = meta?.total ?? null; |
63 | 70 | data = recievedData; |
64 | | - filters = data.columns.filter(({ type }) => 'step' === type); |
| 71 | + filters = recievedData.columns.filter(({ type }) => 'step' === type); |
65 | 72 | } |
66 | 73 | fetching = false; |
67 | 74 | }) |
|
74 | 81 | }); |
75 | 82 |
|
76 | 83 | function selectFilter(event: Event): void { |
| 84 | + // Page is reset on filters, so when filtered we start from scratch, and not accidentally end up on a page that has no content |
77 | 85 | page = 1; |
78 | | - selectedFilter = Number((event.target as HTMLInputElement).value) || null; |
| 86 | + selectedFilter = parseInteger((event.target as HTMLInputElement).value); |
79 | 87 | } |
80 | 88 | </script> |
81 | 89 |
|
|
0 commit comments