add basic leaderboard view

This commit is contained in:
Ilion Beyst 2022-05-18 22:03:46 +02:00
parent 30de8107b4
commit 17d29c5397
2 changed files with 88 additions and 12 deletions

View file

@ -0,0 +1,72 @@
<script lang="ts">
import { onMount } from "svelte";
let leaderboard = [];
onMount(async () => {
const res = await fetch("/api/leaderboard", {
headers: {
"Content-Type": "application/json",
},
});
if (res.ok) {
leaderboard = await res.json();
console.log(leaderboard);
}
});
function formatRating(entry: object): any {
const rating = entry["rating"];
if (rating != null) {
return rating.toFixed(0);
} else {
// why does this happen?
return "-inf";
}
}
</script>
<div class="container">
<table class="leaderboard">
<tr class="leaderboard-row leaderboard-header">
<th class="leaderboard-rank" />
<th class="leaderboard-rating">Rating</th>
<th class="leaderboard-bot">Bot</th>
<th class="leaderboard-author">Author</th>
</tr>
{#each leaderboard as entry, index}
<tr class="leaderboard-row">
<td class="leaderboard-rank">{index + 1}</td>
<td class="leaderboard-rating">
{formatRating(entry)}
</td>
<td class="leaderboard-bot">{entry["bot"]["name"]}</td>
<td class="leaderboard-author">
{#if entry["author"]}
{entry["author"]["username"]}
{/if}
</td>
</tr>
{/each}
</table>
</div>
<style lang="scss">
.container {
overflow-y: scroll;
height: 100%;
}
.leaderboard {
margin: 18px auto;
text-align: center;
}
.leaderboard th,
.leaderboard td {
padding: 8px 16px;
}
.leaderboard-rank {
color: #333;
}
</style>

View file

@ -13,11 +13,13 @@
import SubmitPane from "$lib/components/SubmitPane.svelte";
import OutputPane from "$lib/components/OutputPane.svelte";
import RulesView from "$lib/components/RulesView.svelte";
import Leaderboard from "$lib/components/Leaderboard.svelte";
enum ViewMode {
Editor,
MatchVisualizer,
Rules,
Leaderboard,
}
let matches = [];
@ -111,10 +113,10 @@
return log;
}
function selectEditor() {
function setViewMode(viewMode_: ViewMode) {
selectedMatchId = undefined;
selectedMatchLog = undefined;
viewMode = ViewMode.Editor;
viewMode = viewMode_;
}
function selectRules() {
@ -140,17 +142,24 @@
<div
class="editor-button sidebar-item"
class:selected={viewMode === ViewMode.Editor}
on:click={selectEditor}
on:click={() => setViewMode(ViewMode.Editor)}
>
Editor
</div>
<div
class="rules-button sidebar-item"
class:selected={viewMode === ViewMode.Rules}
on:click={selectRules}
on:click={() => setViewMode(ViewMode.Rules)}
>
Rules
</div>
<div
class="sidebar-item"
class:selected={viewMode === ViewMode.Leaderboard}
on:click={() => setViewMode(ViewMode.Leaderboard)}
>
Leaderboard
</div>
<div class="sidebar-header">match history</div>
<ul class="match-list">
{#each matches as match}
@ -175,6 +184,8 @@
<EditorView {editSession} />
{:else if viewMode === ViewMode.Rules}
<RulesView />
{:else if viewMode === ViewMode.Leaderboard}
<Leaderboard />
{/if}
</div>
<div class="sidebar-right">
@ -218,16 +229,9 @@
height: 100%;
}
.editor-button {
padding: 15px;
}
.rules-button {
padding: 15px;
}
.sidebar-item {
color: #eee;
padding: 15px;
}
.sidebar-item:hover {