From 3a4a0f6f2bf9aff14c00c6acee637319d7458bbb Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Wed, 12 Nov 2025 14:18:36 +0100 Subject: Memory added --- court.mjs | 42 +++++++++++++++++++++++-------- index.js | 40 +++++++----------------------- player.mjs | 84 ++++++++++++++++++++++++++++++++++++++++++++++++-------------- utils.mjs | 38 ++++++++++++++++++++-------- 4 files changed, 133 insertions(+), 71 deletions(-) diff --git a/court.mjs b/court.mjs index e252cb5..cb895f0 100644 --- a/court.mjs +++ b/court.mjs @@ -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 ``; } } -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 diff --git a/index.js b/index.js index 949ea80..6d74bd2 100644 --- a/index.js +++ b/index.js @@ -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", () => { diff --git a/player.mjs b/player.mjs index da94e42..5d8f16a 100644 --- a/player.mjs +++ b/player.mjs @@ -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 ``; } } @@ -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 { + 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 diff --git a/utils.mjs b/utils.mjs index 308bba8..afe200c 100644 --- a/utils.mjs +++ b/utils.mjs @@ -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'); + }); + } } } -- cgit v1.3.1