implement very basic UI
This commit is contained in:
parent
bcb08a64d2
commit
624063b91e
33
index.html
Normal file
33
index.html
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de-AT">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>Watterblock</title>
|
||||||
|
<script src="vendored/mithril-2.3.8.js" defer></script>
|
||||||
|
<script type="module">
|
||||||
|
// initialize DB early
|
||||||
|
import WbDb from "./data/db.js";
|
||||||
|
WbDb.get();
|
||||||
|
|
||||||
|
// mount app
|
||||||
|
import App from "./ui/app.js";
|
||||||
|
m.mount(document.body, App);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<p>Watterblock wird geladen…</p>
|
||||||
|
<noscript>
|
||||||
|
<p>Das Laden des Watterblocks ist fehlgeschlagen.</p>
|
||||||
|
<p>
|
||||||
|
Der Watterblock ist ein Programm, dass direkt in deinem Browser läuft.
|
||||||
|
Der Server sendet nur am Anfang die benötigten Dateien. Für die
|
||||||
|
Funktionalität ist daher <em>JavaScript</em> zwingend erforderlich.
|
||||||
|
</p>
|
||||||
|
<p><strong>Bitte aktiviere <em>JavaScript</em> wieder.</strong></p>
|
||||||
|
</noscript>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
12
ui/app.js
Normal file
12
ui/app.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
import Session from "../models/session.js";
|
||||||
|
import SessionView from "./session.js";
|
||||||
|
|
||||||
|
export default class App {
|
||||||
|
#session = new Session();
|
||||||
|
|
||||||
|
view() {
|
||||||
|
return m(SessionView, { model: this.#session });
|
||||||
|
}
|
||||||
|
}
|
||||||
44
ui/game.js
Normal file
44
ui/game.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
import { Team } from "../models/round.js";
|
||||||
|
import Game from "../models/game.js";
|
||||||
|
import RoundView from "./round.js";
|
||||||
|
|
||||||
|
export default class GameView {
|
||||||
|
/** @param {{ attrs: { model: Game } }} param The game model to use. */
|
||||||
|
view({ attrs: { model } }) {
|
||||||
|
let { winner, points, ourPoints, theirPoints } = model.result;
|
||||||
|
|
||||||
|
let markers = "•".repeat(points);
|
||||||
|
|
||||||
|
return m("section", [
|
||||||
|
m("table", [
|
||||||
|
m("thead", [
|
||||||
|
m("tr", [
|
||||||
|
m("th", "se"), m("th", "mia"),
|
||||||
|
]),
|
||||||
|
winner !== null
|
||||||
|
? m("tr", [
|
||||||
|
m("td", winner === Team.We ? markers : ""),
|
||||||
|
m("td", winner === Team.They ? markers : ""),
|
||||||
|
])
|
||||||
|
: null,
|
||||||
|
]),
|
||||||
|
m("tbody", model.rounds.map(function(round) {
|
||||||
|
return m("tr", [
|
||||||
|
m("td", round.winner === Team.They ? round.points : ""),
|
||||||
|
m("td", round.winner === Team.We ? round.points : ""),
|
||||||
|
]);
|
||||||
|
})),
|
||||||
|
m("tfoot", [
|
||||||
|
m("tr", [
|
||||||
|
m("th", theirPoints), m("th", ourPoints),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
(model.currentRound !== null)
|
||||||
|
? m(RoundView, { model: model.currentRound })
|
||||||
|
: null,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
51
ui/round.js
Normal file
51
ui/round.js
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
import { Round, Team } from "../models/round.js";
|
||||||
|
|
||||||
|
export default class RoundView {
|
||||||
|
|
||||||
|
/** @param { { attrs: { model: Round } } } param The round model to use. */
|
||||||
|
view({ attrs: { model } }) {
|
||||||
|
let winner = "no koana";
|
||||||
|
if (model.winner === Team.We)
|
||||||
|
winner = "mia";
|
||||||
|
else if (model.winner === Team.They)
|
||||||
|
winner = "se";
|
||||||
|
|
||||||
|
return m("section", [
|
||||||
|
m("p", `${model.points} Punkte`),
|
||||||
|
m("div", [
|
||||||
|
m("button",
|
||||||
|
{
|
||||||
|
onclick: () => model.raise(Team.They),
|
||||||
|
disabled: !model.canRaise(Team.They),
|
||||||
|
},
|
||||||
|
"se erhöhn",
|
||||||
|
),
|
||||||
|
m("button",
|
||||||
|
{
|
||||||
|
onclick: () => model.raise(Team.We),
|
||||||
|
disabled: !model.canRaise(Team.We),
|
||||||
|
},
|
||||||
|
"mia erhöhn",
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
m("div", [
|
||||||
|
m("button",
|
||||||
|
{
|
||||||
|
onclick: () => model.winner = Team.They,
|
||||||
|
disabled: model.decided,
|
||||||
|
},
|
||||||
|
"se habn gwonnen",
|
||||||
|
),
|
||||||
|
m("button",
|
||||||
|
{
|
||||||
|
onclick: () => model.winner = Team.We,
|
||||||
|
disabled: model.decided,
|
||||||
|
},
|
||||||
|
"mia habn gwonnen",
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
16
ui/session.js
Normal file
16
ui/session.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
import Session from "../models/session.js";
|
||||||
|
import GameView from "./game.js";
|
||||||
|
|
||||||
|
export default class SessionView {
|
||||||
|
/** @param {{ attrs: { model: Session } }} param The session model to use. */
|
||||||
|
view({ attrs: { model } }) {
|
||||||
|
return m("article", [
|
||||||
|
model.games.map((g) => m(GameView, { model: g })),
|
||||||
|
model.currentGame !== null
|
||||||
|
? m(GameView, { model: model.currentGame })
|
||||||
|
: m("button", { onclick: () => model.anotherGame() }, "no a spiel"),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
1698
vendored/mithril-2.3.8.js
Normal file
1698
vendored/mithril-2.3.8.js
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user