diff --git a/src/components/runners/RunnersOverview.svelte b/src/components/runners/RunnersOverview.svelte index edd3832f..d4a3bf36 100644 --- a/src/components/runners/RunnersOverview.svelte +++ b/src/components/runners/RunnersOverview.svelte @@ -214,7 +214,7 @@ /> {#each headerGroup.headers as header} - + {/each} {/each} @@ -245,7 +245,6 @@
- {/if} {/if} - \ No newline at end of file + diff --git a/src/components/scans/ScansOverview.svelte b/src/components/scans/ScansOverview.svelte index 96fa9ba7..dd2d004a 100644 --- a/src/components/scans/ScansOverview.svelte +++ b/src/components/scans/ScansOverview.svelte @@ -2,19 +2,42 @@ import { _ } from "svelte-i18n"; import { ScanService, TrackService } from "@odit/lfk-client-js"; import store from "../../store"; + import { + createSvelteTable, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + renderComponent, + } from "@tanstack/svelte-table"; + import { onMount } from "svelte"; + import { writable } from "svelte/store"; import Toastify from "toastify-js"; + import TableBottom from "../shared/TableBottom.svelte"; + import TableHeader from "../shared/TableHeader.svelte"; import ScansEmptyState from "./ScansEmptyState.svelte"; - import ThFilterRunner from "./ThFilterRunner.svelte"; - import ThFilterTrack from "./ThFilterTrack.svelte"; + import InputElement from "../shared/InputElement.svelte"; + import TableActions from "../shared/TableActions.svelte"; + + $: selectedScans = + $table?.getSelectedRowModel().rows.map((row) => row.original) || []; + $: selected = + $table?.getSelectedRowModel().rows.map((row) => row.index) || []; + + $: active_delete = undefined; $: active_deletes = []; export let current_scans = []; - const handler = new DataHandler(current_scans, { rowsPerPage: 20 }); - const rows = handler.getRows(); const scans_promise = ScanService.scanControllerGetAll().then((val) => { current_scans = val; - handler.setRows(val); + // handler.setRows(val); + current_scans = val; + options.update((options) => ({ + ...options, + data: current_scans, + })); }); - $: allTracks = []; + let allTracks = []; TrackService.trackControllerGetAll().then((val) => { allTracks = val; }); @@ -38,6 +61,85 @@ Math.floor(laptime / 60) * 60 }`; } + + const columns = [ + { + accessorKey: "id", + header: () => "id", + filterFn: `equalsString`, + }, + { + accessorKey: "runner", + header: () => $_("runner"), + cell: (info) => { + const runner = info.getValue(); + return `#${runner.id} - ${runner.firstname} ${runner.lastname}`; + }, + enableColumnFilter: true, + }, + { + accessorKey: "lapTime", + header: () => $_("laptime"), + cell: (info) => { + return format_laptime(info.getValue()); + }, + enableColumnFilter: false, + }, + { + accessorKey: "distance", + header: () => $_("distance"), + cell: (info) => { + if (info.getValue() < 1000) { + return `${info.getValue()}m`; + } + return `${(info.getValue() / 1000).toFixed(1)}km`; + }, + enableColumnFilter: false, + }, + { + accessorKey: "track", + header: () => $_("track"), + cell: (info) => { + const track = info.getValue(); + return track.name; + }, + enableColumnFilter: true, + }, + { + accessorKey: "actions", + header: () => $_("action"), + cell: (info) => { + return renderComponent(TableActions, { + detailsLink: `./${info.row.original.id}`, + deleteAction: () => { + active_delete = + current_scans[ + current_scans.findIndex((r) => r.id == info.row.original.id) + ]; + }, + deleteEnabled: + store.state.jwtinfo.userdetails.permissions.includes("SCAN:DELETE"), + }); + }, + enableColumnFilter: false, + enableSorting: false, + }, + ]; + const options = writable({ + data: [], + columns: columns, + initialState: { + pagination: { + pageSize: 50, + }, + }, + enableRowSelection: true, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + }); + const table = createSvelteTable(options); {#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:GET")} @@ -53,171 +155,51 @@ {#if current_scans.length === 0} {:else} -
- - - - - - - - - - - - - - - +
+
ID - {$_("runner")} - - {$_("distance")} - - {$_("track")} - - {$_("laptime")} - - {$_("status")} - - {$_("action")} -
- - - - - - -
+ + {#each $table.getHeaderGroups() as headerGroup} + + + {#each headerGroup.headers as header} + + {/each} + + {/each} - - {#each $rows as scan} - - + {#each $table.getRowModel().rows as row} + + - - - - - - - {#if active_deletes[scan.id] === true} - - {:else} - - {/if} + {/each} {/each}
+ $table.toggleAllRowsSelected()} + /> +
-
- {scan.id} -
+
+ row.toggleSelected()} + /> - - -
- {#if scan.distance < 1000} - {scan.distance}m - {:else}{scan.distance / 1000}km{/if} -
-
-
- {#if scan.track} - {scan.track.name} - - {/if} -
-
- {#if scan.responseType === "TRACKSCAN"} -
- {format_laptime(scan.lapTime)} -
- {:else} -
- {$_("scan-with-fixed-distance")} -
- {/if} -
-
- {#if scan.valid} - {$_("valid")} - {:else} - {$_("invalid")} - {/if} -
-
- - + {#each row.getVisibleCells() as cell} + + - {$_("details")} - {#if store.state.jwtinfo.userdetails.permissions.includes("SCAN:DELETE")} - - {/if} -
+ {/if} {:catch error}
diff --git a/src/components/shared/TableBottom.svelte b/src/components/shared/TableBottom.svelte index 33eb8ddf..1d6194fb 100644 --- a/src/components/shared/TableBottom.svelte +++ b/src/components/shared/TableBottom.svelte @@ -1,71 +1,71 @@ +
- - - - - -
Page
- - {$table.getState().pagination.pageIndex + 1} of{" "} - {$table.getPageCount()} - -
- - | Go to page: - { - const page = e.target.value ? Number(e.target.value) - 1 : 0; - $table.setPageIndex(page); - }} - class="border p-1 rounded w-16" - /> - - { + const page = e.target.value ? Number(e.target.value) - 1 : 0; + $table.setPageIndex(page); }} - > - {#each [25, 50, 100, 250, 500] as pageSize} - - {/each} - -
- -
- {Object.keys(selected).length} of{" "} - {$table.getPreFilteredRowModel().rows.length} Total Rows Selected -
\ No newline at end of file + class="border p-1 rounded w-16" + /> + + +
+ +
+ {Object.keys(selected).length} of{" "} + {$table.getPreFilteredRowModel().rows.length} Total Rows Selected +