add basic leaderboard view
This commit is contained in:
parent
30de8107b4
commit
17d29c5397
2 changed files with 88 additions and 12 deletions
72
web/pw-server/src/lib/components/Leaderboard.svelte
Normal file
72
web/pw-server/src/lib/components/Leaderboard.svelte
Normal 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>
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue