commit e0f3047739a2c2338b74c8f47e14584752fdad8e
Author: Oshgnacknak <osh@oshgnacknak.de>
Date: Sat, 15 Dec 2018 16:10:16 +0100
Initial Commit
Diffstat:
7 files changed, 175 insertions(+), 0 deletions(-)
diff --git a/README.md b/README.md
@@ -0,0 +1,3 @@
+# Crosstable
+
+This is a simble web-app for Turnament-Crosstables, for example in chess roundturnaments (each vs each).
diff --git a/domlib.js b/domlib.js
@@ -0,0 +1,30 @@
+import players from "./players.js";
+
+function createElement(type, innerHTML = "", parent=null) {
+ const elem = document.createElement(type);
+ elem.innerHTML = innerHTML;
+ if (parent) {
+ parent.appendChild(elem);
+ }
+ return elem;
+}
+
+function updatePlayerTable() {
+ player_table.innerHTML = "";
+ const tr = createElement("tr", "", player_table);
+ for (let s of ["Nr", "Name"]) {
+ createElement("th", s, tr);
+ }
+ for (let s of players.map((p, i) => i+1)) {
+ createElement("th", s, tr);
+ }
+ for (let s of ["Score", "Place"]) {
+ createElement("th", s, tr);
+ }
+ for (let p of players) {
+ p.createTr(players);
+ }
+}
+
+
+export {createElement, updatePlayerTable};
diff --git a/index.html b/index.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+
+<head>
+ <meta charset="utf-8">
+ <link rel="stylesheet" href="style.css">
+ <title>Crosstable</title>
+</head>
+
+<body>
+ <header>
+ <h1>Crosstable</h1>
+ </header>
+
+ <p id="player_add">
+ Name: <input id="player_name_input" type="text" value="">
+ <button id="player_add_button">Add Player</button>
+ </p>
+
+ <p>
+ <table id="player_table" class="printable" border="1" cellpadding="0" cellspacing="0" >
+ </table>
+ </p>
+ <script type="module" src="main.js" charset="utf-8"></script>
+</body>
+
+</html>
diff --git a/main.js b/main.js
@@ -0,0 +1,25 @@
+import {createElement, updatePlayerTable} from "./domlib.js";
+import players from "./players.js";
+import Player from "./player.js";
+
+
+player_add_button.onclick = addPlayer;
+player_name_input.onkeypress = event => {
+ if (event.keyCode == 13) {
+ addPlayer();
+ }
+}
+
+function addPlayer(event){
+ players.push(new Player(player_name_input.value, players.length));
+ player_name_input.value = "";
+ updatePlayerTable();
+}
+
+function main() {
+ updatePlayerTable();
+}
+window.addEventListener("load", main);
+window.onbeforeunload = event => {
+ return "true";
+}
diff --git a/player.js b/player.js
@@ -0,0 +1,72 @@
+import {createElement, updatePlayerTable} from "./domlib.js";
+import players from "./players.js";
+
+export default class Player {
+ constructor(name, id) {
+ this.name = name;
+ this.id = id;
+ this.points = [];
+ }
+
+ createTr() {
+ const tr = createElement("tr", "", player_table);
+
+ for (let s of [this.id + 1, this.name]) {
+ createElement("td", s, tr);
+ }
+
+ for (let i=0; i<players.length; i++) {
+ const td = createElement("td", "", tr);
+ const input = createElement("input", "", td);
+ if (i == this.id) {
+ input.disabled = true;
+ input.value = "XXX";
+ } else {
+ if (this.points.length>i) {
+ input.value = this.points[i] != undefined ? this.points[i] : "";
+ }
+ }
+ input.size = 1;
+ input.onkeypress = event => {
+ event.preventDefault();
+ let point;
+ switch (event.key) {
+ case "1":
+ point = 1;
+ break;
+ case "2":
+ case "5":
+ case ",":
+ case ".":
+ point = .5;
+ break;
+ case "0":
+ point = 0;
+ break;
+ default:
+ return;
+ }
+ this.points[i] = point;
+ players[i].points[this.id] = 1 - point;
+ updatePlayerTable();
+ }
+ }
+
+ for (let s of [this.getPointSum(), this.getPlace()]) {
+ createElement("td", s, tr);
+ }
+
+ return tr;
+ }
+
+ getPointSum() {
+ return this.points.reduce((a, b) => a + b, 0);
+ }
+
+ getPlace() {
+ const sortedPlayers = players.map(p => {
+ return {id: p.id, points: p.getPointSum()}
+ }).sort((a, b) => b.points-a.points);
+ return sortedPlayers.map(e => e.id).indexOf(this.id)+1;
+ }
+}
diff --git a/players.js b/players.js
@@ -0,0 +1,2 @@
+const players = [];
+export default players;
diff --git a/style.css b/style.css
@@ -0,0 +1,16 @@
+body {
+ font-size: 24px;
+}
+
+table * {
+ padding: 2px 5px;
+}
+
+
+table tr:nth-child(2n) {
+ padding: 2px;
+}
+
+*:not(.printable *, .printable) {
+ display: none;
+}