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