From e4b599e57e076bef7caa8f5825bbca17540b571d Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Fri, 14 Nov 2025 15:58:36 +0100 Subject: Unified the data classes --- src/court.mjs | 41 ++++++------------------ src/data.js | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/game.mjs | 78 +++++++++++++--------------------------------- src/guest.mjs | 56 +++++++++------------------------ src/player.mjs | 60 ++++++++++------------------------- src/utils.mjs | 34 ++++++++++++-------- 6 files changed, 181 insertions(+), 186 deletions(-) create mode 100644 src/data.js (limited to 'src') diff --git a/src/court.mjs b/src/court.mjs index 713c488..d85f05e 100644 --- a/src/court.mjs +++ b/src/court.mjs @@ -1,53 +1,32 @@ +import { Court } from "./data"; 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); - } - toggle() { - this.status = !this.status; - this.print(); - } - print() { - let status = this.status ? "active" : "inactive"; - console.log(this.name + " is currently " + status); - } - render() { - let color = this.status ? "is-success" : "is-danger"; - let type = `class="button is-medium ${color}"`; - return ``; - } -} - export class CourtManager extends Manager { maxCourtCount = 12; constructor() { - super("court", []); + super(); console.log("Loading court data."); - let data = JSON.parse(localStorage.getItem(this.description)); + let tempCourt = new Court(); + let data = JSON.parse(localStorage.getItem(tempCourt.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)); + let id = Number(data[i].id); + let status = Boolean(Number(data[i].status)); + this.data.push(new Court(id, status)); } - console.log("Loaded " + this.listData.length + " courts."); + console.log("Loaded " + this.data.length + " courts."); this.render(); - this.addBehaviour(); } generate() { - console.log("Generating court data."); for (let i = 0; i < this.maxCourtCount; i++) { - this.listData.push(new Court(i)); + this.data.push(new Court(i, true)); } - console.log("Generated data for " + this.listData.length + " courts"); + console.log("Generated data for " + this.data.length + " courts"); this.store(); this.render(); - this.addBehaviour(); } } diff --git a/src/data.js b/src/data.js new file mode 100644 index 0000000..4358ee6 --- /dev/null +++ b/src/data.js @@ -0,0 +1,98 @@ +class Switch { + constructor(id, description, status) { + this.id = id; + this.status = typeof status !== "undefined" ? status : false; + this.description = description; + this.name = description + " " + (id + 1); + } + toggle() { + this.status = !this.status; + this.print(); + } + print() { + let status = this.status ? "active" : "inactive"; + console.log(this.name + " is currently " + status); + } + render() { + let color = this.status ? "is-success" : "is-danger"; + let type = `class="button is-medium ${color}"`; + let id = this.description + "_" + this.id; + return ``; + } +} + +export class Court extends Switch { + constructor(id, status) { + super(id, "Court", status); + } +} + +export class Player extends Switch { + constructor(id, status, level, games, name) { + super(id, "Regular", status); + this.level = typeof level !== "undefined" ? level : 1; + this.games = typeof games !== "undefined" ? games : 0; + if (typeof name !== "undefined") { + this.name = name; + } + } +} + +const guestCategories = { + 0: { description: "Beginner", level: 1 }, + 1: { description: "Novice", level: 3 }, + 2: { description: "Intermediate", level: 6 }, +}; + +export class Guest extends Switch { + maxCount = 4; + categoryCount = 3; + + constructor(id, status, games) { + super(id, "Guest", status); + const categoryId = Math.floor(id / this.maxCount) || 0; + this.level = guestCategories[categoryId].level; + this.games = typeof games !== "undefined" ? games : 0; + const guestNumber = (id % this.maxCount) + 1; + this.name = guestCategories[categoryId].description + " " + guestNumber; + } +} + +export class Team { + constructor(playerOne, playerTwo) { + this.playerOne = playerOne; + this.playerTwo = playerTwo; + } + print() { + console.log("Team consists of:"); + this.playerOne.print(); + this.playerTwo.print(); + } + render() { + let p1 = `${this.playerOne}`; + let p2 = `${this.playerTwo}`; + return p1 + p2; + } +} + +export class Game extends Switch { + constructor(id, status, teamOne, teamTwo) { + super(id, "Game", status); + this.teamOne = teamOne; + this.teamTwo = teamTwo; + } + print() { + super.print(); + let teamOne = this.teamOne.playerOne + " and " + this.teamOne.playerTwo; + let teamTwo = this.teamTwo.playerOne + " and " + this.teamTwo.playerTwo; + console.log(teamOne + " is playing against " + teamTwo); + } + render() { + let blockedState = this.teamOne.playerOne === "RESERVED"; + let type = blockedState ? `class="is-danger is-dark"` : ``; + let court = `${ + this.id + 1 + }`; + return `${court}${this.teamOne.render()}${this.teamTwo.render()}`; + } +} diff --git a/src/game.mjs b/src/game.mjs index 864f255..9a2a921 100644 --- a/src/game.mjs +++ b/src/game.mjs @@ -2,48 +2,14 @@ import { Notyf } from "notyf"; import { Manager } from "./utils.mjs"; import { CourtManager } from "./court.mjs"; import { PlayerManager } from "./player.mjs"; +import { Team, Game } from "./data"; -class Team { - constructor(playerOne, playerTwo) { - this.playerOne = playerOne; - this.playerTwo = playerTwo; - } - print() { - console.log(this.playerOne + " and " + this.playerTwo); - } - render() { - let p1 = `${this.playerOne}`; - let p2 = `${this.playerTwo}`; - return p1 + p2; - } -} - -class Game { - constructor(id, teamOne, teamTwo, status) { - this.id = id; - this.teamOne = teamOne; - this.teamTwo = teamTwo; - this.status = typeof status !== "undefined" ? status : false; - } - print() { - let teamOne = this.teamOne.playerOne + " and " + this.teamOne.playerTwo; - let teamTwo = this.teamTwo.playerOne + " and " + this.teamTwo.playerTwo; - console.log(teamOne + " is playing against " + teamTwo); - } - render() { - let blockedState = this.teamOne.playerOne === "RESERVED"; - let type = blockedState ? `class="is-danger is-dark"` : ``; - return `${ - this.id + 1 - }${this.teamOne.render()}${this.teamTwo.render()}`; - } -} function generateDummyGames(courts, description) { let team = new Team(description, description); let games = []; for (const court of courts) { - let game = new Game(court.id, team, team); + let game = new Game(court.id, false, team, team); games.push(game); } return games; @@ -54,10 +20,11 @@ export class GameManager extends Manager { players = new PlayerManager(); constructor() { - super("game", []); + super(); this.round = Number(localStorage.getItem("round")) || 0; console.log("Loading game data."); - let data = JSON.parse(localStorage.getItem(this.description)); + let tempGame = new Game(); + let data = JSON.parse(localStorage.getItem(tempGame.description)); if (data === null || data.length === 0) { console.log("Game data unavailable: " + data); this.generate(); @@ -74,29 +41,28 @@ export class GameManager extends Manager { data[i].teamTwo.playerTwo ); let status = Boolean(data[i].status); - this.listData.push(new Game(id, teamOne, teamTwo, status)); + this.data.push(new Game(id, status, teamOne, teamTwo)); } - console.log("Loaded " + this.listData.length + " games."); + console.log("Loaded " + this.data.length + " games."); this.render(); addGameBehaviour(this); } isConfirmed() { - return this.listData[0].status; + return this.data[0].status; } generate() { console.log("Generating the dummy round."); - this.listData = generateDummyGames(this.courts.listData, "---"); - console.log("Loaded " + this.listData.length + " dummy round."); - for (let i = 0; i < this.listData.length; i++) { - this.listData[i].status = true; + this.data = generateDummyGames(this.courts.data, "---"); + console.log("Loaded " + this.data.length + " dummy round."); + for (let i = 0; i < this.data.length; i++) { + this.data[i].status = true; } - console.log(this.listData); this.store(); this.render(); } addBehaviour() { let description = this.isConfirmed() ? "Round " + this.round : "Proposal"; - document.getElementById("game_description").innerHTML = description; + document.getElementById("Game_description").innerHTML = description; } getBlockedGames() { const inactiveCourts = this.courts.inactive(); @@ -114,7 +80,7 @@ export class GameManager extends Manager { const courtPlayers = players.slice(startIndex, endIndex); const team_1 = new Team(courtPlayers[0].name, courtPlayers[3].name); const team_2 = new Team(courtPlayers[1].name, courtPlayers[2].name); - const game = new Game(courts[index].id, team_1, team_2); + const game = new Game(courts[index].id, false, team_1, team_2); game.print(); games.push(game); } @@ -123,22 +89,22 @@ export class GameManager extends Manager { propose() { console.log("Proposing new games!"); let possibleMatches = getMatchCount( - this.players.listData.concat(this.players.g.listData), - this.courts.listData + this.players.data.concat(this.players.g.data), + this.courts.data ); console.log("Total possible matches are " + possibleMatches + "."); - this.listData = this.getBlockedGames(); + this.data = this.getBlockedGames(); const activeCourts = this.courts.active(); const unusedCourts = activeCourts.slice(possibleMatches + 1); - this.listData = this.listData.concat(this.inactive(unusedCourts)); + this.data = this.data.concat(this.inactive(unusedCourts)); const usedCourts = activeCourts.slice(0, possibleMatches); let requiredPlayerCount = possibleMatches * 4; const selectedPlayers = this.players.propose(requiredPlayerCount); console.log("The matches are:"); - this.listData = this.listData.concat( + this.data = this.data.concat( this.active(usedCourts, selectedPlayers) ); - this.listData.sort((a, b) => a.id - b.id); + this.data.sort((a, b) => a.id - b.id); this.render(); } confirm() { @@ -150,8 +116,8 @@ export class GameManager extends Manager { console.log("Confirm the proposal for round " + this.round + "."); this.round += 1; localStorage.setItem("round", this.round); - for (let i = 0; i < this.listData.length; i++) { - this.listData[i].status = true; + for (let i = 0; i < this.data.length; i++) { + this.data[i].status = true; } this.store(); this.render(); diff --git a/src/guest.mjs b/src/guest.mjs index c82d115..57eb237 100644 --- a/src/guest.mjs +++ b/src/guest.mjs @@ -1,65 +1,37 @@ import { Manager } from "./utils.mjs"; - -export class Guest { - maxGuestCount = 12; - categoryCount = 3; - - categories = { - 0: { description: "Beginner", level: 1 }, - 1: { description: "Novice", level: 3 }, - 2: { description: "Intermediate", level: 6 }, - }; - - constructor(id, status, totalPlayed) { - this.id = id; - this.status = typeof status !== "undefined" ? status : false; - const categoryId = Math.floor(id / (12 / this.categoryCount)); - const guestIdentifier = (id % (12 / this.categoryCount)) + 1; - this.name = this.categories[categoryId].description + " " + guestIdentifier; - this.level = this.categories[categoryId].level; - this.totalPlayed = typeof totalPlayed !== "undefined" ? status : 0; - } - toggle() { - this.status = !this.status; - this.print(); - } - print() { - let status = this.status ? "active" : "inactive"; - console.log(this.name + " is currently " + status); - } - render() { - let color = this.status ? "is-success" : "is-danger"; - let type = `class="button is-medium ${color}"`; - return ``; - } -} +import { Guest } from "./data"; export class GuestManager extends Manager { constructor() { super("guest", []); console.log("Loading guest data."); - let data = JSON.parse(localStorage.getItem(this.description)); + let tempGuest = new Guest(); + let data = JSON.parse(localStorage.getItem(tempGuest.description)); if (data === null || data.length === 0) { console.log("Guest data unavailable: " + data); this.generate(); return; } + console.log(tempGuest.description); for (let i = 0; i < data.length; i++) { + console.log(data[i]); let id = Number(data[i].id); - let status = data[i].status; - let totalPlayed = data[i].totalPlayed; - this.listData.push(new Guest(id, status, totalPlayed)); + let status = Boolean(Number(data[i].status)); + let games = data[i].games; + this.data.push(new Guest(id, status, games)); } - console.log("Loaded " + this.listData.length + " players."); + console.log("Loaded " + this.data.length + " players."); this.render(); } generate() { console.log("Generating guest data."); - for (let i = 0; i < new Guest(0, false).maxGuestCount; i++) { + const tempGuest = new Guest(0, false); + const totalGuestCount = tempGuest.maxCount * tempGuest.categoryCount; + for (let i = 0; i < totalGuestCount; i++) { let p = new Guest(i, false, 0); - this.listData.push(p); + this.data.push(p); } - console.log("Generated data for " + this.listData.length + " guest"); + console.log("Generated data for " + this.data.length + " guest"); this.store(); this.render(); } diff --git a/src/player.mjs b/src/player.mjs index 7ca2a1f..06b1abd 100644 --- a/src/player.mjs +++ b/src/player.mjs @@ -1,53 +1,24 @@ import { GuestManager } from "./guest.mjs"; -import { shuffle, Manager } from "./utils.mjs"; +import { shuffle, Manager, randomLevel, randomStatus } from "./utils.mjs"; +import { Player } from "./data"; -class Player { - constructor(id, name, level, status, totalPlayed) { - this.id = id; - this.status = typeof status !== "undefined" ? status : false; - this.name = name; - this.level = typeof level !== "undefined" ? level : 1; - this.totalPlayed = typeof totalPlayed !== "undefined" ? status : 0; - } - toggle() { - this.status = !this.status; - this.print(); - } - print() { - let status = this.status ? "active" : "inactive"; - console.log(this.name + " is currently " + status); - } - render() { - let color = this.status ? "is-success" : "is-danger"; - let type = `class="button is-medium ${color}"`; - return ``; - } -} - -function randomLevel() { - const max_level = 10; - return Math.floor(Math.random() * max_level + 1); -} - -function randomStatus() { - return Math.random() < 0.5; -} function parseLineToPlayer(data) { var info = data.split(","); var id = Number(info[0].trim()); var name = info[1].trim() + " " + info[2].trim(); var level = Number(info[3].trim()); - return new Player(id, name, level, true, 0); + return new Player(id, true, level, 0, name); } export class PlayerManager extends Manager { g = new GuestManager(); constructor() { - super("regular", []); + super(); console.log("Loading player data."); - let data = JSON.parse(localStorage.getItem(this.description)); + let tempPlayer = new Player(); + let data = JSON.parse(localStorage.getItem(tempPlayer.description)); if (data === null || data.length === 0) { console.log("Player data unavailable: " + data); this.generate(); @@ -56,12 +27,12 @@ export class PlayerManager extends Manager { for (let i = 0; i < data.length; i++) { let id = Number(data[i].id); let name = data[i].name; - let level = data[i].level; - let status = data[i].status; - let totalPlayed = data[i].totalPlayed; - this.listData.push(new Player(id, name, level, status, totalPlayed)); + let level = Number(data[i].level); + let status = Boolean(Number(data[i].status)); + let games = Number(data[i].games); + this.data.push(new Player(id, status, level, games, name)); } - console.log("Loaded " + this.listData.length + " players."); + console.log("Loaded " + this.data.length + " players."); this.render(); this.addBehaviour(); addLoadBehaviour(this); @@ -70,10 +41,11 @@ export class PlayerManager extends Manager { 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); + let p = new Player(i, randomStatus(), randomLevel()); + console.log(p); + this.data.push(p); } - console.log("Generated data for " + this.listData.length + " players"); + console.log("Generated data for " + this.data.length + " players"); this.store(); this.render(); } @@ -90,7 +62,7 @@ export class PlayerManager extends Manager { for (var i = 0; i < players.length; i++) { players[i].print(); } - this.listData = players; + this.data = players; this.store(); this.render(); } diff --git a/src/utils.mjs b/src/utils.mjs index 97d1255..2fca3f5 100644 --- a/src/utils.mjs +++ b/src/utils.mjs @@ -91,31 +91,30 @@ function addTimerBehaviour(t) { } export class Manager { - constructor(description, listData) { - this.description = description; - this.listData = listData; - this.count = listData.length; + constructor() { + this.data = []; + this.count = this.data.length; } store() { - let stringData = JSON.stringify(this.listData); - localStorage.setItem(this.description, stringData); + let stringData = JSON.stringify(this.data); + localStorage.setItem(this.data[0].description, stringData); } render() { - let renderedHTML = this.listData + let renderedHTML = this.data .map((i) => { return i.render(); }) .join(""); - let elementId = this.description + "_list"; + let elementId = this.data[0].description + "_list"; document.getElementById(elementId).innerHTML = renderedHTML; this.addBehaviour(); } addBehaviour() { - for (let idx = 0; idx < this.listData.length; ++idx) { - const elementId = this.description + "_" + this.listData[idx].id; + for (let idx = 0; idx < this.data.length; ++idx) { + const elementId = this.data[0].description + "_" + this.data[idx].id; const p = document.getElementById(elementId); p.addEventListener("click", () => { - this.listData[idx].toggle(); + this.data[idx].toggle(); this.store(); p.classList.toggle("is-success"); p.classList.toggle("is-danger"); @@ -123,12 +122,12 @@ export class Manager { } } active() { - return this.listData.filter(function (c) { + return this.data.filter(function (c) { return c.status; }); } inactive() { - return this.listData.filter(function (c) { + return this.data.filter(function (c) { return !c.status; }); } @@ -142,6 +141,15 @@ export function shuffle(array) { return array; } +export function randomLevel() { + const max_level = 10; + return Math.floor(Math.random() * max_level + 1); +} + +export function randomStatus() { + return Math.random() < 0.5; +} + export function getNotifier(seconds) { return new Notyf({ duration: seconds * milliSecond, -- cgit v1.3.1