Crosstable

A simple web-app for tournament-crosstables, for example in chess round tournament (each vs each).
git clone git://git.oshgnacknak.de/Crosstable.git
Log | Files | Refs | README

commit e0f3047739a2c2338b74c8f47e14584752fdad8e
Author: Oshgnacknak <osh@oshgnacknak.de>
Date:   Sat, 15 Dec 2018 16:10:16 +0100

Initial Commit

Diffstat:
AREADME.md | 3+++
Adomlib.js | 30++++++++++++++++++++++++++++++
Aindex.html | 27+++++++++++++++++++++++++++
Amain.js | 25+++++++++++++++++++++++++
Aplayer.js | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aplayers.js | 2++
Astyle.css | 16++++++++++++++++
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; +}