Leaderboard: Fix leaderboard table sort and account for no seasonpickresult
All checks were successful
Build Formula11 Docker Image / pocketbase-docker (push) Successful in 38s

This commit is contained in:
2025-12-26 21:53:58 +01:00
parent 7cb0931329
commit ba307eb4c4

View File

@ -2,7 +2,13 @@
import { make_chart_options } from "$lib/chart"; import { make_chart_options } from "$lib/chart";
import { Table, type TableColumn } from "$lib/components"; import { Table, type TableColumn } from "$lib/components";
import { get_by_value } from "$lib/database"; import { get_by_value } from "$lib/database";
import type { RacePickPoints, RacePickPointsAcc, SeasonPickPoints, User } from "$lib/schema"; import type {
RacePickPoints,
RacePickPointsAcc,
RacePickPointsTotal,
SeasonPickPoints,
User,
} from "$lib/schema";
import type { PageData } from "./$types"; import type { PageData } from "./$types";
import { import {
LineChart, LineChart,
@ -24,8 +30,28 @@
let racepickpointsacc: RacePickPointsAcc[] | undefined = $state(undefined); let racepickpointsacc: RacePickPointsAcc[] | undefined = $state(undefined);
data.racepickpointsacc.then((r: RacePickPointsAcc[]) => (racepickpointsacc = r)); data.racepickpointsacc.then((r: RacePickPointsAcc[]) => (racepickpointsacc = r));
let racepickpointstotal: RacePickPointsTotal[] | undefined = $state(undefined);
let seasonpickpoints: SeasonPickPoints[] | undefined = $state(undefined); let seasonpickpoints: SeasonPickPoints[] | undefined = $state(undefined);
data.seasonpickpoints.then((p: SeasonPickPoints[]) => (seasonpickpoints = p)); Promise.all([data.racepickpointstotal, data.seasonpickpoints]).then(
([rpp, spp]: [RacePickPointsTotal[], SeasonPickPoints[]]) => {
if (spp.length === 0 || !spp) {
racepickpointstotal = rpp;
seasonpickpoints = undefined;
return;
}
racepickpointstotal = rpp.sort((a: RacePickPointsTotal, b: RacePickPointsTotal) => {
let apoints = spp.filter((p: SeasonPickPoints) => p.user === a.user)[0];
let bpoints = spp.filter((p: SeasonPickPoints) => p.user === b.user)[0];
return (
b.total_points +
calc_season_points(bpoints) -
(a.total_points + calc_season_points(apoints))
);
});
seasonpickpoints = spp;
},
);
const calc_season_points = (p: SeasonPickPoints): number => { const calc_season_points = (p: SeasonPickPoints): number => {
return ( return (
@ -51,13 +77,17 @@
data_value_name: "user", data_value_name: "user",
label: "Total", label: "Total",
valuefun: async (value: string): Promise<string> => { valuefun: async (value: string): Promise<string> => {
let seasonpoints = await data.seasonpickpoints; if (!racepickpointstotal) {
let points = get_by_value(await data.racepickpointstotal, "user", value)?.total_points ?? 0; return "ERR";
if (!seasonpoints) { }
// let seasonpoints = await data.seasonpickpoints;
let points = get_by_value(racepickpointstotal, "user", value)?.total_points ?? 0;
if (!seasonpickpoints) {
return `<span class='badge variant-filled-surface'>${points}</span>`; return `<span class='badge variant-filled-surface'>${points}</span>`;
} }
points += calc_season_points(get_by_value(seasonpoints, "user", value)!); points += calc_season_points(get_by_value(seasonpickpoints, "user", value)!);
return `<span class='badge variant-filled-surface'>${points}</span>`; return `<span class='badge variant-filled-surface'>${points}</span>`;
}, },
}, },
@ -74,7 +104,7 @@
label: "Season", label: "Season",
valuefun: async (value: string): Promise<string> => { valuefun: async (value: string): Promise<string> => {
if (!seasonpickpoints) { if (!seasonpickpoints) {
return ""; return "🍆";
} }
let p = seasonpickpoints.filter((p: SeasonPickPoints) => p.user === value)[0]; let p = seasonpickpoints.filter((p: SeasonPickPoints) => p.user === value)[0];
@ -126,7 +156,7 @@
</div> </div>
<div class="mt-2"> <div class="mt-2">
{#await data.racepickpointstotal then racepickpointstotal} {#if racepickpointstotal}
<Table data={racepickpointstotal} columns={leaderboard_columns} /> <Table data={racepickpointstotal} columns={leaderboard_columns} />
{/await} {/if}
</div> </div>