Skip to content

Commit 001bc6b

Browse files
committed
Added data table refresh component
1 parent b6a4579 commit 001bc6b

File tree

7 files changed

+59
-11
lines changed

7 files changed

+59
-11
lines changed

src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/EventsDataTable.svelte

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
import type { EventSummaryModel, SummaryTemplateKeys } from '../summary/index';
99
1010
interface Props {
11+
bodyChildren?: Snippet;
1112
isLoading: boolean;
1213
limit: number;
13-
rowclick?: (row: EventSummaryModel<SummaryTemplateKeys>) => void;
14+
rowClick?: (row: EventSummaryModel<SummaryTemplateKeys>) => void;
1415
table: Table<EventSummaryModel<SummaryTemplateKeys>>;
1516
toolbarChildren?: Snippet;
1617
}
1718
18-
let { isLoading, limit = $bindable(), rowclick, table, toolbarChildren }: Props = $props();
19+
let { bodyChildren, isLoading, limit = $bindable(), rowClick, table, toolbarChildren }: Props = $props();
1920
</script>
2021

2122
<DataTable.Root>
@@ -24,14 +25,17 @@
2425
{@render toolbarChildren()}
2526
{/if}
2627
</DataTable.Toolbar>
27-
<DataTable.Body {rowclick} {table}>
28+
<DataTable.Body {rowClick} {table}>
2829
{#if isLoading}
2930
<DelayedRender>
3031
<DataTable.Loading {table} />
3132
</DelayedRender>
3233
{:else}
3334
<DataTable.Empty {table} />
3435
{/if}
36+
{#if bodyChildren}
37+
{@render bodyChildren()}
38+
{/if}
3539
</DataTable.Body>
3640
<DataTable.Pagination {table}>
3741
<DataTable.PageSize bind:value={limit} {table}></DataTable.PageSize>

src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/data-table/data-table-body.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
1313
interface Props {
1414
children?: Snippet;
15-
rowclick?: (row: TData) => void;
15+
rowClick?: (row: TData) => void;
1616
table: SvelteTable<TData>;
1717
}
1818
19-
let { children, rowclick, table }: Props = $props();
19+
let { children, rowClick, table }: Props = $props();
2020
2121
function getHeaderColumnClass(header: Header<TData, unknown>) {
2222
const classes = [(header.column.columnDef.meta as { class?: string })?.class || ''];
@@ -36,8 +36,8 @@
3636
return;
3737
}
3838
39-
if (rowclick) {
40-
rowclick(cell.row.original);
39+
if (rowClick) {
40+
rowClick(cell.row.original);
4141
}
4242
}
4343
</script>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<script module lang="ts">
2+
type TData = unknown;
3+
</script>
4+
5+
<script generics="TData" lang="ts">
6+
import type { Snippet } from 'svelte';
7+
8+
import { Button } from '$comp/ui/button';
9+
import * as Table from '$comp/ui/table';
10+
import { type Table as SvelteTable } from '@tanstack/svelte-table';
11+
12+
interface Props {
13+
children?: Snippet;
14+
refresh: () => Promise<void>;
15+
table: SvelteTable<TData>;
16+
}
17+
18+
let { children, refresh, table }: Props = $props();
19+
</script>
20+
21+
<Table.Row class="text-center">
22+
<Table.Cell colspan={table.getVisibleLeafColumns().length}>
23+
{#if children}
24+
{@render children()}
25+
{:else}
26+
New data is available!
27+
<Button variant="link" onclick={refresh} class="px-0">Click here to see the latest changes and reset any selections.</Button>
28+
{/if}
29+
</Table.Cell>
30+
</Table.Row>

src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/data-table/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Empty from './data-table-empty.svelte';
33
import Loading from './data-table-loading.svelte';
44
import PageSize from './data-table-page-size.svelte';
55
import Pagination from './data-table-pagination.svelte';
6+
import Refresh from './data-table-refresh.svelte';
67
import Toolbar from './data-table-toolbar.svelte';
78
import Root from './data-table.svelte';
89

@@ -14,11 +15,13 @@ export {
1415
Loading as DataTableLoading,
1516
PageSize as DataTablePageSize,
1617
Pagination as DataTablePagination,
18+
Refresh as DataTableRefresh,
1719
Toolbar as DataTableToolbar,
1820
Empty,
1921
Loading,
2022
PageSize,
2123
Pagination,
24+
Refresh,
2225
Root,
2326
Toolbar
2427
};

src/Exceptionless.Web/ClientApp/src/routes/(app)/+page.svelte

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import type { EventSummaryModel, SummaryTemplateKeys } from '$features/events/components/summary/index';
33
4+
import * as DataTable from '$comp/data-table';
45
import * as FacetedFilter from '$comp/faceted-filter';
56
import { toFacetedFilters } from '$comp/filters/facets';
67
import { DateFilter, filterChanged, filterRemoved, FilterSerializer, getDefaultFilters, type IFilter, toFilter } from '$comp/filters/filters.svelte';
@@ -15,7 +16,7 @@
1516
import { useFetchClientStatus } from '$shared/api/api.svelte';
1617
import { persisted } from '$shared/persisted.svelte';
1718
import { type FetchClientResponse, useFetchClient } from '@exceptionless/fetchclient';
18-
import { createTable, type RowSelectionState } from '@tanstack/svelte-table';
19+
import { createTable } from '@tanstack/svelte-table';
1920
import { useEventListener } from 'runed';
2021
import { debounce } from 'throttle-debounce';
2122
import IconOpenInNew from '~icons/mdi/open-in-new';
@@ -122,6 +123,11 @@
122123
await debouncedLoadData();
123124
}
124125
126+
async function refresh() {
127+
showRefreshStaleDataRow = false;
128+
await loadData();
129+
}
130+
125131
useEventListener(document, 'refresh', async () => await loadData());
126132
useEventListener(document, 'PersistentEventChanged', async (event) => await onPersistentEvent((event as CustomEvent).detail));
127133
@@ -134,10 +140,15 @@
134140
<Card.Root>
135141
<Card.Title class="p-6 pb-0 text-2xl" level={2}>Events</Card.Title>
136142
<Card.Content>
137-
<EventsDataTable bind:limit={limit.value} isLoading={clientStatus.isLoading} {rowclick} {table}>
143+
<EventsDataTable bind:limit={limit.value} isLoading={clientStatus.isLoading} rowClick={rowclick} {table}>
138144
{#snippet toolbarChildren()}
139145
<FacetedFilter.Root changed={onFilterChanged} {facets} remove={onFilterRemoved}></FacetedFilter.Root>
140146
{/snippet}
147+
{#snippet bodyChildren()}
148+
{#if showRefreshStaleDataRow}
149+
<DataTable.DataTableRefresh {table} {refresh} />
150+
{/if}
151+
{/snippet}
141152
</EventsDataTable>
142153
</Card.Content>
143154
</Card.Root>

src/Exceptionless.Web/ClientApp/src/routes/(app)/issues/+page.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
<Card.Root>
113113
<Card.Title class="p-6 pb-0 text-2xl" level={2}>Issues</Card.Title>
114114
<Card.Content>
115-
<EventsDataTable bind:limit={limit.value} isLoading={clientStatus.isLoading} {rowclick} {table}>
115+
<EventsDataTable bind:limit={limit.value} isLoading={clientStatus.isLoading} rowClick={rowclick} {table}>
116116
{#snippet toolbarChildren()}
117117
<FacetedFilter.Root changed={onFilterChanged} {facets} remove={onFilterRemoved}></FacetedFilter.Root>
118118
{/snippet}

src/Exceptionless.Web/ClientApp/src/routes/(app)/stream/+page.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
<DataTable.Toolbar {table}>
141141
<FacetedFilter.Root changed={onFilterChanged} {facets} remove={onFilterRemoved}></FacetedFilter.Root>
142142
</DataTable.Toolbar>
143-
<DataTable.Body {rowclick} {table}>
143+
<DataTable.Body rowClick={rowclick} {table}>
144144
{#if clientStatus.isLoading}
145145
<DelayedRender>
146146
<DataTable.Loading {table} />

0 commit comments

Comments
 (0)