aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaran Jayachandra <karan.jayachandra@nxp.com>2025-11-12 14:18:36 +0100
committerKaran Jayachandra <karan.jayachandra@nxp.com>2025-11-12 14:18:36 +0100
commit3a4a0f6f2bf9aff14c00c6acee637319d7458bbb (patch)
tree8f136ad7fcaad95d7b3028138ed092a07ed10162
parentca3e550fb59af89a2ddc0e1e0e59a3025edbece7 (diff)
Memory added
-rw-r--r--court.mjs42
-rw-r--r--index.js40
-rw-r--r--player.mjs84
-rw-r--r--utils.mjs38
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 `<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
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 `<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
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');
+ });
+ }
}
}