diff options
| -rw-r--r-- | court.mjs | 42 | ||||
| -rw-r--r-- | index.js | 40 | ||||
| -rw-r--r-- | player.mjs | 84 | ||||
| -rw-r--r-- | utils.mjs | 38 |
4 files changed, 133 insertions, 71 deletions
@@ -1,8 +1,10 @@ -export class Court { - constructor(id) { +import { Manager } from "./utils.mjs"; + +class Court { + constructor(id, status) { this.id = id; + this.status = typeof status !== 'undefined' ? status : true; this.name = "Court " + (id + 1); - this.status = true; } toggle() { this.status = !this.status; @@ -13,16 +15,36 @@ export class Court { console.log(this.name + " is currently " + status); } render() { - let type = this.status ? `class="button is-medium is-success"` : 'class="button is-medium is-dark"'; + let type = this.status ? `class="button is-success"` : 'class="button is-danger"'; return `<button id=${"court_" + this.id} ${type}>${this.name}</button>`; } } -export function generateCourts() { - let courts = []; - const totalCourts = 12; - for (let i = 0; i < totalCourts; i++) { - courts.push(new Court(i)); +export class CourtManager extends Manager { + maxCourtCount = 12; + + constructor() { + super("court", []); + console.log("Loading court data."); + let data = JSON.parse(localStorage.getItem(this.description)); + if (data === null || data.length != this.maxCourtCount) { + console.log("Court data unavailable: " + data); + this.generate(); + return; + } + for (let i = 0; i < this.maxCourtCount; i++) { + this.listData.push(new Court(data[i].id, data[i].status)); + } + console.log("Loaded " + this.listData.length + " courts."); + this.render(); + } + generate() { + console.log("Generating court data."); + for (let i = 0; i < this.maxCourtCount; i++) { + this.listData.push(new Court(i)); + } + console.log("Generated data for " + this.listData.length + " courts"); + this.store(); + this.render(); } - return courts; }
\ No newline at end of file @@ -1,48 +1,26 @@ -import { generateCourts } from "./court.mjs"; -import { addToggleBehaviour } from "./utils.mjs"; -import { csvToPlayers, generatePlayers } from "./player.mjs"; +import { CourtManager } from "./court.mjs"; +import { PlayerManager, addLoadBehaviour } from "./player.mjs"; import { Round, generateDummyGames, proposeGames } from "./game.mjs"; -// Court handling -let courts = generateCourts(); // Persist this in local storage with 1 day limit -addToggleBehaviour(courts, "court_"); - - -// Regulars handling -let regulars = generatePlayers(); // Persist this in local storage without limit -addToggleBehaviour(regulars, "regular_"); -const fileInput = document.querySelector("#player-load input[type=file]"); -if (fileInput !== null) { - fileInput.onchange = () => { - if (fileInput.files.length > 0) { - const file = fileInput.files[0]; - if (file) { - const reader = new FileReader(); - reader.onload = function(e) { - const content = e.target.result; - regulars = csvToPlayers(content); - addToggleBehaviour(regulars, "regular_"); - }; - reader.readAsText(file); - } - } - } -} +// Court and player handling +let c = new CourtManager(); +let p = new PlayerManager(); +addLoadBehaviour(p); // Game handling let proposal; let session = []; // Persist this in local storage with 1 day limit -if (session.length === 0) {session.push(new Round(generateDummyGames(courts, "---"), 0))}; +if (session.length === 0) {session.push(new Round(generateDummyGames(c.listData, "---"), 0))}; document.getElementById("game_list").innerHTML = session.at(-1).render(); document.getElementById("propose").addEventListener("click", () => { let normalize = Number(document.getElementById("skill").value); console.log(normalize); - regulars = regulars.map(function(p) { + let players = p.listData.map(function(p) { p.skill = Math.ceil(p.skill / normalize); return p; }) - proposal = proposeGames(regulars, courts); + proposal = proposeGames(players, c.listData); document.getElementById("game_list").innerHTML = new Round(proposal).render(); }) document.getElementById("confirm").addEventListener("click", () => { @@ -1,4 +1,6 @@ -export class Player { +import { Manager } from "./utils.mjs"; + +class Player { constructor(id, name, level, status, totalPlayed) { this.id = id; this.name = name; @@ -15,7 +17,7 @@ export class Player { console.log(this.name + " has a level of " + this.level + " and is currently " + status); } render() { - let type = this.status ? `class="button is-medium is-success"` : 'class="button is-medium is-danger"'; + let type = this.status ? `class="button is-success"` : 'class="button is-danger"'; return `<button id=${"regular_" + this.id} ${type}>${this.name}</button>`; } } @@ -29,14 +31,6 @@ function randomStatus() { return Math.random() < 0.5; } -export function generatePlayers() { - let players = []; - for (let i = 0; i < 71; i++) { - players.push(new Player(i, "Player " + i, randomLevel(), randomStatus(), 0)); - } - return players; -} - function parseLineToPlayer(data) { var info = data.split(","); var id = Number(info[0].trim()); @@ -45,14 +39,66 @@ function parseLineToPlayer(data) { return new Player(id, name, level, true, 0); } -export function csvToPlayers(csv) { - var lines = csv.split("\n"); - var players = []; - for (var i = 1; i < lines.length; i++) { - if(lines[i] == undefined || lines[i].trim() == "") {continue;} - players.push(parseLineToPlayer(lines[i])); +export class PlayerManager extends Manager { + constructor() { + super("regular", []); + console.log("Loading player data."); + let data = JSON.parse(localStorage.getItem(this.description)); + if (data === null || data.length === 0) { + console.log("Player data unavailable: " + data); + this.generate(); + return; + } + for (let i = 0; i < data.length; i++) { + var id = Number(data[i].id); + var name = data[i].name; + var level = data[i].level; + var status = data[i].status; + var totalPlayed = data[i].totalPlayed; + this.listData.push(new Player(id, name, level, status, totalPlayed)); + } + console.log("Loaded " + this.listData.length + " players."); + this.render(); } - console.log("Loaded " + players.length + " Players"); - for (var i=0; i<players.length; i++) {players[i].print();} - return players; + generate() { + console.log("Generating player data."); + let maxPlayerCount = 71; + for (let i = 0; i < maxPlayerCount; i++) { + let p = new Player(i, "Player " + i, randomLevel(), randomStatus(), 0); + this.listData.push(p); + } + console.log("Generated data for " + this.listData.length + " players"); + this.store(); + this.render(); + } + import(data) { + var lines = data.split("\n"); + var players = []; + for (var i = 1; i < lines.length; i++) { + if(lines[i] == undefined || lines[i].trim() == "") {continue;} + players.push(parseLineToPlayer(lines[i])); + } + console.log("Loaded " + players.length + " Players"); + for (var i=0; i<players.length; i++) {players[i].print();} + this.listData = players; + this.store(); + this.render(); + } +} + +// Try to add this functionality inside the class to call after constructor +export function addLoadBehaviour(p) { + const f = document.querySelector("#player-load input[type=file]"); + f.addEventListener("change", () => { + const file = f.files[0]; + let importData; + console.log("Loading data from "+ file.name); + const reader = new FileReader(); + reader.onload = function(e) { + importData = reader.result; + p.import(importData); + }; + reader.readAsText(file); + }) + }
\ No newline at end of file @@ -1,14 +1,30 @@ -export function addToggleBehaviour(list, description) { - let renderedHTML = list.map((i) => {return i.render();}).join(''); - let listId = description + 'list'; - document.getElementById(listId).innerHTML = renderedHTML; - for (let index = 0; index < list.length; ++index) { - const p = document.getElementById(description + list[index].id); - p.addEventListener("click", () => { - list[index].toggle(); - p.classList.toggle('is-success'); - p.classList.toggle('is-danger'); - }); +export class Manager { + constructor(description, listData) { + this.description = description; + this.listData = listData; + this.count = listData.length; + } + store() { + let stringData = JSON.stringify(this.listData); + localStorage.setItem(this.description, stringData); + } + render() { + let renderedHTML = this.listData.map((i) => {return i.render();}).join(''); + let elementId = this.description + '_list'; + document.getElementById(elementId).innerHTML = renderedHTML; + this.addToggleBehaviour(); + } + addToggleBehaviour() { + for (let idx = 0; idx < this.listData.length; ++idx) { + const elementId = this.description + "_" + this.listData[idx].id; + const p = document.getElementById(elementId); + p.addEventListener("click", () => { + this.listData[idx].toggle(); + this.store(); + p.classList.toggle('is-success'); + p.classList.toggle('is-danger'); + }); + } } } |
