aboutsummaryrefslogtreecommitdiff
path: root/src/main.js
diff options
context:
space:
mode:
authorKaran Jayachandra <karan.jayachandra@nxp.com>2025-11-14 17:15:13 +0100
committerKaran Jayachandra <karan.jayachandra@nxp.com>2025-11-14 17:15:13 +0100
commit27b3a8f4fe5f6259983a7bcf44e7e987f8e19e09 (patch)
tree02ce6df25efe337f2dc94d45a83149038f44fba5 /src/main.js
parente4b599e57e076bef7caa8f5825bbca17540b571d (diff)
Simplified the file structure
Diffstat (limited to 'src/main.js')
-rw-r--r--src/main.js143
1 files changed, 140 insertions, 3 deletions
diff --git a/src/main.js b/src/main.js
index 0e05e0d..d66ddb6 100644
--- a/src/main.js
+++ b/src/main.js
@@ -2,8 +2,145 @@ import "notyf/notyf.min.css";
import "bulma/css/bulma.css";
import "@fortawesome/fontawesome-free/css/all.css";
import "./style.css";
-import { GameManager } from "./game.mjs";
-import { Timer } from "./utils.mjs";
+import { Manager, Timer } from "./utils";
+import { CourtManager, PlayerManager } from "./court";
+import { Team, Game } from "./data";
+
+export class GameManager extends Manager {
+ t = new Timer();
+ courts = new CourtManager();
+ players = new PlayerManager();
+
+ constructor() {
+ super("Game", 12);
+ this.round = Number(localStorage.getItem("round")) || 0;
+ this.render();
+ addGameBehaviour(this);
+ }
+ createItem(i, description) {
+ if (typeof description === "undefined") {
+ description = "---";
+ }
+ let team = new Team(description, description);
+ return new Game(i, true, team, team);
+ }
+ loadItem(data) {
+ let id = Number(data.id);
+ let teamOne = new Team(data.teamOne.playerOne, data.teamOne.playerTwo);
+ let teamTwo = new Team(data.teamTwo.playerOne, data.teamTwo.playerTwo);
+ let status = Boolean(data.status);
+ return new Game(id, status, teamOne, teamTwo);
+ }
+ addBehaviour() {
+ let description = this.isConfirmed() ? "Round " + this.round : "Proposal";
+ document.getElementById("Game_description").innerHTML = description;
+ }
+ isConfirmed() {
+ return this.data[0].status;
+ }
+ getBlockedGames() {
+ const inactiveCourts = this.courts.inactive();
+ console.log("Total reserved courts are " + inactiveCourts.length + ".");
+ let games = [];
+ for (let court of inactiveCourts) {
+ games.push(this.createItem(court.id, "RESERVED"));
+ }
+ return games;
+ }
+ inactive(courts) {
+ let games = [];
+ for (let court of courts) {
+ games.push(this.createItem(court.id));
+ }
+ return games;
+ }
+ active(courts, players) {
+ let games = [];
+ for (let index = 0; index < courts.length; index++) {
+ const startIndex = 4 * index;
+ const endIndex = startIndex + 4;
+ 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, false, team_1, team_2);
+ game.print();
+ games.push(game);
+ }
+ return games;
+ }
+ propose() {
+ console.log("Proposing new games!");
+ let possibleMatches = getMatchCount(
+ this.players.data.concat(this.players.g.data),
+ this.courts.data
+ );
+ console.log("Total possible matches are " + possibleMatches + ".");
+ this.data = this.getBlockedGames();
+ const activeCourts = this.courts.active();
+ const unusedCourts = activeCourts.slice(possibleMatches + 1);
+ 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.data = this.data.concat(this.active(usedCourts, selectedPlayers));
+ this.data.sort((a, b) => a.id - b.id);
+ this.render();
+ }
+ confirm() {
+ if (this.isConfirmed()) {
+ const notification = new Notyf();
+ notification.error("Create a proposal first!");
+ return;
+ }
+ console.log("Confirm the proposal for round " + this.round + ".");
+ this.round += 1;
+ localStorage.setItem("round", this.round);
+ for (let i = 0; i < this.data.length; i++) {
+ this.data[i].status = true;
+ }
+ this.store();
+ this.render();
+ document.getElementById("timer-start").click();
+ const notification = new Notyf();
+ notification.success("Round confirmed!");
+ }
+ reset() {
+ localStorage.removeItem("round");
+ localStorage.removeItem(this.description);
+ localStorage.removeItem(this.courts.description);
+ document.getElementById("timer-stop").click();
+ window.location.reload();
+ const notification = new Notyf();
+ notification.error("Session has been reset!");
+ }
+}
+
+function getMatchCount(players, courts) {
+ courts = courts.filter(function (c) {
+ return c.status;
+ });
+ console.log("There are a total of " + courts.length + " courts available.");
+ console.log(players);
+ players = players.filter(function (p) {
+ return p.status;
+ });
+ console.log("There are a total of " + players.length + " players available.");
+ var possibleMatches = Math.floor(players.length / 4);
+ possibleMatches = Math.min(possibleMatches, courts.length);
+ return possibleMatches;
+}
+
+function addGameBehaviour(g) {
+ document.getElementById("propose").addEventListener("click", () => {
+ g.propose();
+ });
+ document.getElementById("confirm").addEventListener("click", () => {
+ g.confirm();
+ });
+ document.getElementById("reset").addEventListener("click", () => {
+ g.reset();
+ });
+}
-const t = new Timer();
const g = new GameManager();