diff options
| author | Karan Jayachandra <me@karanj.com> | 2025-11-14 18:10:49 +0100 |
|---|---|---|
| committer | Karan Jayachandra <me@karanj.com> | 2025-11-14 18:10:49 +0100 |
| commit | 202cf761e5162720f25521a75ae7cd6a4e0e5456 (patch) | |
| tree | 0e57324bc72629cba3ed817b3439780f6959e509 /src/manage.js | |
| parent | 90390365bd93a4ee086c2931bb70ffa571a726b9 (diff) | |
| parent | 56eb065a8165b3f508a35734adbb00c76bee012a (diff) | |
Merge branch 'develop' into 'main'
Develop
See merge request KaranJayachandra/match_up!21
Diffstat (limited to 'src/manage.js')
| -rw-r--r-- | src/manage.js | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/src/manage.js b/src/manage.js new file mode 100644 index 0000000..952c72f --- /dev/null +++ b/src/manage.js @@ -0,0 +1,179 @@ +import { Court, Guest, Player } from "./data"; + +export class Manager { + constructor(description, maxCount) { + this.description = description; + this.maxCount = maxCount; + this.data = []; + this.count = this.data.length; + let data = JSON.parse(localStorage.getItem(this.description)); + if (data === null || data.length === 0) { + this.generate(); + return; + } + this.load(data); + } + generate() { + for (let i = 0; i < this.maxCount; i++) { + this.data.push(this.createItem(i)); + } + console.log("Generated " + this.data.length + " " + this.description); + this.store(); + this.render(); + } + load(data) { + for (let i = 0; i < data.length; i++) { + this.data.push(this.loadItem(data[i])); + } + console.log("Loaded " + this.data.length + " " + this.description); + this.render(); + } + store() { + let stringData = JSON.stringify(this.data); + localStorage.setItem(this.data[0].description, stringData); + } + render() { + let renderedHTML = this.data + .map((i) => { + return i.render(); + }) + .join(""); + let elementId = this.data[0].description + "_list"; + document.getElementById(elementId).innerHTML = renderedHTML; + this.addBehaviour(); + } + addBehaviour() { + 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.data[idx].toggle(); + this.store(); + p.classList.toggle("is-success"); + p.classList.toggle("is-danger"); + }); + } + } + active() { + return this.data.filter(function (c) { + return c.status; + }); + } + inactive() { + return this.data.filter(function (c) { + return !c.status; + }); + } +} + +export class CourtManager extends Manager { + constructor() { + super("Court", 12); + } + createItem(i) { + return new Court(i, randomStatus()); + } + loadItem(data) { + let id = Number(data.id); + let status = Boolean(Number(data.status)); + return new Court(id, status); + } +} + +export function randomStatus() { + return Math.random() < 0.5; +} + +function normalize(data) { + let factor = Number(document.getElementById("skill").value); + console.log("Normalize skill by a factor of " + factor + "."); + return data.map(function (p) { + p.skill = Math.ceil(p.skill / factor); + return p; + }); +} + +export class GuestManager extends Manager { + constructor() { + super("Guest", 12); + } + createItem(i) { + return new Guest(i, randomStatus()); + } + loadItem(data) { + let id = Number(data.id); + let status = Boolean(Number(data.status)); + let games = data.games; + return new Guest(id, status, games); + } + active() { + return normalize(super.active()); + } +} + +export function randomLevel() { + const maxLevel = 10; + return Math.floor(Math.random() * maxLevel + 1); +} + +export class PlayerManager extends Manager { + constructor() { + super("Regular", 71); + addLoadBehaviour(this); + } + createItem(i) { + return new Player(i, randomStatus(), randomLevel()); + } + loadItem(data) { + let id = Number(data.id); + let name = data.name; + let level = Number(data.level); + let status = Boolean(Number(data.status)); + let games = Number(data.games); + return new Player(id, status, level, games, name); + } + active() { + return normalize(super.active()); + } +} + +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, randomStatus(), level, 0, name); +} + +function parseCsv(data) { + let lines = data.split("\n"); + let players = []; + for (let 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 (let i = 0; i < players.length; i++) { + players[i].print(); + } + return players; +} + +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.data = parseCsv(importData); + p.store(); + p.render(); + }; + reader.readAsText(file); + }); +} |
