aboutsummaryrefslogtreecommitdiff
path: root/src/manage.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/manage.js')
-rw-r--r--src/manage.js179
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);
+ });
+}