made triple events go off of the highest score instead of the average

This commit is contained in:
2026-07-04 14:56:32 +01:00
parent 62af341a1e
commit bfa49cfa91
4 changed files with 35 additions and 21 deletions

View File

@@ -12,7 +12,6 @@ ledger view
inserting manually into ledger
# Database - HIGH PRIORITY
make events score based off of highest score instead of avg
load results from the excel sheet i made
export whole contest results to csv

View File

@@ -1,4 +1,4 @@
presetName,numberOfResults,unit,lowerIsBetter,averageResults
default,1,m,0,0
three,3,m,0,1
three,3,m,0,0
race,1,s,1,0
1 presetName numberOfResults unit lowerIsBetter averageResults
2 default 1 m 0 0
3 three 3 m 0 1 0
4 race 1 s 1 0

View File

@@ -57,6 +57,7 @@ export async function POST({ request }: any) {
for (let result in currentPlayer.scores) {
let currentResult = currentPlayer.scores[result];
if (currentResult === null || currentResult === undefined) continue;
let newScoreEntry = await db
.insert(schema.registeredResults)
.values({

View File

@@ -75,10 +75,10 @@
return valid.reduce((a, b) => a + b, 0) / valid.length;
}
function best(scores: (number | null)[], fallback = Infinity): number {
function best(scores: (number | null)[], lowerIsBetter: boolean, fallback = Infinity): number {
const valid = scores.filter((s): s is number => s !== null);
if (valid.length === 0) return fallback;
return Math.min(...valid);
return lowerIsBetter ? Math.min(...valid) : Math.max(...valid);
}
function getPoints(placement: number): number {
@@ -106,10 +106,10 @@
const fallback = lowerIsBetter ? Infinity : -Infinity;
const sa = useAverage
? average(committedScores[a.id] ?? [], fallback)
: best(committedScores[a.id] ?? [], fallback);
: best(committedScores[a.id] ?? [], lowerIsBetter, fallback);
const sb = useAverage
? average(committedScores[b.id] ?? [], fallback)
: best(committedScores[b.id] ?? [], fallback);
: best(committedScores[b.id] ?? [], lowerIsBetter, fallback);
return lowerIsBetter ? sa - sb : sb - sa;
})
@@ -229,7 +229,9 @@
position: i + 1,
points: getPoints(i + 1),
scores: committedScores[p.id] ?? [],
average: average(committedScores[p.id] ?? [])
summaryValue: useAverage
? average(committedScores[p.id] ?? [])
: best(committedScores[p.id] ?? [], lowerIsBetter)
}))
}))
})
@@ -309,6 +311,12 @@
validScores.length > 0
? validScores.reduce((a, b) => a + b, 0) / validScores.length
: 0}
{@const bestScore =
validScores.length > 0
? lowerIsBetter
? Math.min(...validScores)
: Math.max(...validScores)
: 0}
<div
animate:flip={{ duration: 300 }}
class="scoring-player-card"
@@ -362,6 +370,10 @@
<div class="text-sm opacity-60">
avg: {avgScore.toFixed(2)}
</div>
{:else if numResults > 1}
<div class="text-sm opacity-60">
best: {bestScore.toFixed(2)}
</div>
{/if}
{:else if player.playerScores.length > 0}
{#each player.playerScores as score}
@@ -378,20 +390,22 @@
{/each}
</div>
<button
class="mt-4 rounded px-6 py-2 text-white"
class:bg-green-600={submitStatus === 'idle'}
class:bg-gray-400={submitStatus === 'submitting'}
class:bg-blue-600={submitStatus === 'done'}
class:bg-red-600={submitStatus === 'error'}
disabled={submitStatus === 'submitting' || submitStatus === 'done'}
onclick={submitResults}
>
{#if submitStatus === 'idle'}Submit Results
{:else if submitStatus === 'submitting'}Submitting…
{:else if submitStatus === 'done'}Submitted ✓
{:else}Error — Retry{/if}
</button>
{#if event.state == 1}
<button
class="mt-4 rounded px-6 py-2 text-white"
class:bg-green-600={submitStatus === 'idle'}
class:bg-gray-400={submitStatus === 'submitting'}
class:bg-blue-600={submitStatus === 'done'}
class:bg-red-600={submitStatus === 'error'}
disabled={submitStatus === 'submitting' || submitStatus === 'done'}
onclick={submitResults}
>
{#if submitStatus === 'idle'}Submit Results
{:else if submitStatus === 'submitting'}Submitting…
{:else if submitStatus === 'done'}Submitted ✓
{:else}Error — Retry{/if}
</button>
{/if}
</div>
</div>
{/if}