import { Court, Guest, Regular } 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("secondary"); p.classList.toggle("outline"); }); } } 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(description, count) { if ( typeof description === "undefined" ) { description = "Guest"; }; if ( typeof count === "undefined" ) { count = 18; }; super(description, count); } 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()); } incrementGames(list) { for (let index = 0; index < this.data.length; index++ ){ if (list.includes(this.data[index].name)) { console.log("Added game count to " + this.data[index].name); this.data[index].games += 1; } } this.store(); } } export function randomLevel() { const maxLevel = 10; return Math.floor(Math.random() * maxLevel + 1); } export class RegularManager extends GuestManager { constructor() { super("Regular", 71); addLoadBehaviour(this); } createItem(i) { return new Regular(i, randomStatus(), randomLevel()); } loadItem(data) { let id = Number(data.id); let level = Number(data.level); let status = Boolean(Number(data.status)); let games = Number(data.games); let firstName = data.firstName; let lastName = data.lastName; return new Regular(id, status, level, games, firstName, lastName); } reset() { for (let index = 0; index < this.data.length; index++ ){ this.data[index].games = 0; this.data[index].status = false; } } } function parseLineToPlayer(data) { const info = data.split(","); const id = Number(info[0].trim()); const firstName = info[1].trim(); const lastName = info[2].trim(); const level = Number(info[3].trim()); return new Regular(id, randomStatus(), level, 0, firstName, lastName); } 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.getElementById("player-load"); 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); }); }