diff --git a/doc/Notes.md b/doc/Notes.md
new file mode 100644
index 0000000..e38f294
--- /dev/null
+++ b/doc/Notes.md
@@ -0,0 +1,39 @@
+# Notes und kleine Dokumentation
+Was haben wir bereits am iTender Projekt gemacht?
+
+
${content}`;
- modal.style.display = "block";
+ this.currentModalId = id ? id : "null";
+ });
- this.currentModalId = id ? id : "null";
}
public static close(id?: string): void {
diff --git a/src/web/Pane.ts b/src/web/Pane.ts
new file mode 100644
index 0000000..3167080
--- /dev/null
+++ b/src/web/Pane.ts
@@ -0,0 +1,6 @@
+export enum Pane {
+ MAIN= "Main",
+ MENU = "Menü",
+ SETTINGS = "Einstellungen",
+ SETUP = "Setup"
+}
\ No newline at end of file
diff --git a/src/web/Settings.ts b/src/web/Settings.ts
new file mode 100644
index 0000000..7030bc9
--- /dev/null
+++ b/src/web/Settings.ts
@@ -0,0 +1,3 @@
+export class Settings {
+
+}
\ No newline at end of file
diff --git a/src/web/Setup.ts b/src/web/Setup.ts
new file mode 100644
index 0000000..9cf0c66
--- /dev/null
+++ b/src/web/Setup.ts
@@ -0,0 +1,7 @@
+export class Setup {
+ public static onSetupUpdate()
+ {
+ // Setup containers updated
+
+ }
+}
\ No newline at end of file
diff --git a/src/web/WebHandler.ts b/src/web/WebHandler.ts
index 0b7f544..367acb2 100644
--- a/src/web/WebHandler.ts
+++ b/src/web/WebHandler.ts
@@ -1,11 +1,15 @@
import {WebSocketPayload} from "../WebSocketPayload";
import {IDrink} from "../database/IDrink";
import {Modal} from "./Modal";
+import {ButtonType} from "./ButtonType";
+import {Pane} from "./Pane";
+import {setup} from "rpi-gpio";
export class WebHandler {
+ private static containers = [];
+
public static onDrinkUpdate(payload: WebSocketPayload) {
if (!payload.data) return;
-
let drinks: IDrink[] = payload.data;
const main = document.getElementById("main");
@@ -13,6 +17,8 @@ export class WebHandler {
main.style.gridTemplateRows = `repeat(${Math.round(drinks.length / 3)}, calc(90%/2))`;
+ main.innerHTML = "";
+
for (let drink of drinks) {
let drinkEle = document.createElement("div");
drinkEle.classList.add("drink");
@@ -30,25 +36,560 @@ export class WebHandler {
drinkImg.src = "/images/" + drink.name + ".png";
drinkName.innerText = drink.name;
+ /*
let ingredients = "
";
- for( let i of drink.ingredients )
- {
+ for (let i of drink.ingredients) {
ingredients += "
" + i.amount + "ml " + i.type.name + "
";
}
- ingredients+="
"
+ ingredients += ""
drinkEle.onclick = () => {
- let modal = new Modal("drink", drink.name );
- modal.content = `Zutaten
-${ingredients}`
- modal.leftCentered = true;
- modal.open();
- };
+ let modal = new Modal("drink", drink.name);
- main.append(drinkEle);
+ modal.content = `Zutaten
+${ingredients}`*/ //todo
+ //modal.leftCentered = true;
+ // modal.open();
+ //};
+
+ //main.append(drinkEle);
}
}
+ public static onContainerUpdate(payload: WebSocketPayload) {
+
+ }
+
+ static async openSetup() {
+ // new
+ this.openPane(Pane.SETUP);
+ let menuBtn = document.getElementById("menuBtn") as HTMLButtonElement;
+ let setupContainers = document.getElementById("setupContainers") as HTMLDivElement;
+ menuBtn.disabled = true;
+
+ const containerAddBtn = document.getElementById("containerAddBtn") as HTMLButtonElement;
+ containerAddBtn.onclick = () => {
+
+
+ let con = document.createElement("div");
+
+ let containerName = document.createElement("p");
+ containerName.innerText = "Behälter " + (setupContainers.getElementsByTagName("div").length + 1);
+ con.classList.add("setupContainer");
+ con.append(containerName);
+
+ let sensorTypeLabel = document.createElement("label");
+ sensorTypeLabel.innerText = "Art des Sensors ";
+ con.append(sensorTypeLabel);
+
+ let sensorType = document.createElement("select");
+ sensorType.classList.add("input");
+ let sensorTypeNone = document.createElement("option") as HTMLOptionElement;
+ sensorTypeNone.innerText = "Keiner";
+ sensorTypeNone.value = "0";
+ sensorType.append(sensorTypeNone);
+ let sensorTypeUltrasound = document.createElement("option") as HTMLOptionElement;
+ sensorTypeUltrasound.innerText = "Ultraschall";
+ sensorTypeUltrasound.value = "1";
+ sensorType.append(sensorTypeUltrasound);
+ let sensorTypeScale = document.createElement("option") as HTMLOptionElement;
+ sensorTypeScale.innerText = "Wägezelle";
+ sensorTypeScale.value = "2";
+ sensorType.append(sensorTypeScale);
+ con.append(sensorType);
+
+ con.append(document.createElement("br"));
+
+
+ let selectPin = document.createElement("select");
+ selectPin.style.display = "none";
+ selectPin.classList.add("input");
+ selectPin.style.display = "inline";
+
+ let noSel = document.createElement("option") as HTMLOptionElement;
+ noSel.innerText = "Bitte wählen";
+ noSel.value = "-1";
+ noSel.disabled = true;
+
+ selectPin.append(noSel.cloneNode(true));
+ selectPin.selectedIndex = 0;
+
+ const pins = [3, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 21, 22, 23, 24, 26, 29, 31, 32, 33, 34, 35, 36, 37, 38, 40];
+ for (let pin of pins) {
+ let pinEle = document.createElement("option") as HTMLOptionElement;
+ pinEle.innerText = "" + pin;
+ pinEle.value = "" + pin;
+ selectPin.append(pinEle);
+ }
+
+ let pumpLabel = document.createElement("label");
+ pumpLabel.innerText = "Pumpen Pin";
+ con.append(pumpLabel);
+ con.append(selectPin.cloneNode(true));
+
+ con.append(document.createElement("br"));
+
+ let sensor1Label = document.createElement("label");
+ sensor1Label.innerText = "Sensor 1 Pin";
+ con.append(sensor1Label);
+ con.append(selectPin.cloneNode(true));
+
+ con.append(document.createElement("br"));
+
+ let sensor2Label = document.createElement("label");
+ sensor2Label.innerText = "Sensor 2 Pin";
+ con.append(sensor2Label);
+ con.append(selectPin.cloneNode(true));
+
+ con.append(document.createElement("br"));
+
+ let removeBtn = document.createElement("button");
+ removeBtn.classList.add("btn", "btn-danger");
+ removeBtn.onclick = () => {
+ con.classList.add("removeSlowly");
+ setTimeout(() => {
+ con.remove();
+ let i = 1;
+ for (let elementsByTagNameElement of setupContainers.getElementsByTagName("div")) {
+ let e = elementsByTagNameElement.getElementsByTagName("p")[0] as HTMLParagraphElement;
+ e.innerText = "Behälter " + i;
+ i++;
+ }
+ }, 750);
+
+ }
+ removeBtn.style.float = "right";
+ removeBtn.innerText = "Entfernen";
+ con.append(removeBtn);
+
+ setupContainers.append(con);
+
+ };
+ return;
+
+ // old
+ Modal.close();
+ let modal = new Modal("setup", "Setup 1/2");
+
+ let containers: { container: HTMLDivElement, slot: number, pumpPin: HTMLSelectElement, sensorType: HTMLSelectElement, sensorPin1: HTMLSelectElement, sensorPin2: HTMLSelectElement, volume: HTMLSelectElement }[] = [];
+
+ let onchange = () => {
+ let containerEle = document.getElementById("setup_containers") as HTMLDivElement;
+ let containerNumber = document.getElementById("setup_slots") as HTMLInputElement;
+ if (!containerEle || !containerNumber) return;
+
+ let i = 1;
+ let oldElements = containerEle.getElementsByTagName("div");
+ for (let e of oldElements) {
+ if (i > containerNumber.valueAsNumber) {
+ e.remove();
+ containers.pop();
+ }
+ i++;
+ }
+
+ for (let i = containerEle.getElementsByTagName("div").length; i < containerNumber.valueAsNumber; i++) {
+ let con = document.createElement("div");
+ let thisContainer = {};
+ thisContainer["container"] = con;
+ con.classList.add("setupContainer");
+
+ let containerName = document.createElement("p");
+ containerName.innerText = "Container " + (i + 1);
+ thisContainer["slot"] = i + 1;
+
+ con.append(containerName);
+
+ let sensorTypeLabel = document.createElement("label");
+ sensorTypeLabel.innerText = "Art des Sensors ";
+ con.append(sensorTypeLabel);
+
+ let sensorType = document.createElement("select");
+ sensorType.classList.add("input");
+ let sensorTypeNone = document.createElement("option") as HTMLOptionElement;
+ sensorTypeNone.innerText = "Keiner";
+ sensorTypeNone.value = "0";
+ sensorType.append(sensorTypeNone);
+ let sensorTypeUltrasound = document.createElement("option") as HTMLOptionElement;
+ sensorTypeUltrasound.innerText = "Ultraschall";
+ sensorTypeUltrasound.value = "1";
+ sensorType.append(sensorTypeUltrasound);
+ let sensorTypeScale = document.createElement("option") as HTMLOptionElement;
+ sensorTypeScale.innerText = "Wägezelle";
+ sensorTypeScale.value = "2";
+ sensorType.append(sensorTypeScale);
+
+
+ con.append(sensorType);
+ thisContainer["sensorType"] = sensorType;
+
+ con.append(document.createElement("br"));
+
+
+ let changeWhenTypeOfSensor: HTMLElement[] = [];
+ let list = ["Pumpen Port ", "Sensor 1 ", "Sensor 2 "];
+ for (let t of list) {
+ let labelElement = document.createElement("label");
+ labelElement.innerText = t;
+ changeWhenTypeOfSensor.push(labelElement);
+ con.append(labelElement);
+
+ let selectElement = document.createElement("select");
+ labelElement.style.display = "none";
+ selectElement.style.display = "none";
+ selectElement.classList.add("input");
+ if (t == "Sensor 1 ") {
+ thisContainer["sensorPin1"] = selectElement;
+ } else if (t == "Sensor 2 ") {
+ thisContainer["sensorPin2"] = selectElement;
+ } else {
+ thisContainer["pumpPin"] = selectElement;
+ labelElement.style.display = "inline";
+ selectElement.style.display = "inline";
+ }
+
+ let noSel = document.createElement("option") as HTMLOptionElement;
+ noSel.innerText = "Bitte wählen";
+ noSel.value = "-1";
+ noSel.disabled = true;
+
+ selectElement.append(noSel); //loveyou
+ selectElement.selectedIndex = 0;
+
+ const pins = [3, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 18, 19, 21, 22, 23, 24, 26, 29, 31, 32, 33, 34, 35, 36, 37, 38, 40];
+ for (let pin of pins) {
+ let pinEle = document.createElement("option") as HTMLOptionElement;
+ pinEle.innerText = "" + pin;
+ pinEle.value = "" + pin;
+ selectElement.append(pinEle);
+ }
+ con.append(selectElement);
+
+ let br = document.createElement("br");
+ con.append(br);
+ }
+
+ sensorType.onchange = () => {
+ // 0 => ultrasound; 1 => scale
+ if (sensorType.value == "1") {
+ thisContainer["sensorPin1"].style.display = "inline";
+ thisContainer["sensorPin2"].style.display = "inline";
+ changeWhenTypeOfSensor[1].style.display = "inline";
+ changeWhenTypeOfSensor[2].style.display = "inline";
+ changeWhenTypeOfSensor[1].innerText = "Trigger Pin ";
+ changeWhenTypeOfSensor[2].innerText = "Echo Pin ";
+ } else if (sensorType.value == "2") {
+ thisContainer["sensorPin1"].style.display = "inline";
+ thisContainer["sensorPin2"].style.display = "inline";
+ changeWhenTypeOfSensor[1].style.display = "inline";
+ changeWhenTypeOfSensor[2].style.display = "inline";
+ changeWhenTypeOfSensor[1].innerText = "Clock Pin ";
+ changeWhenTypeOfSensor[2].innerText = "Data Pin ";
+ } else {
+ thisContainer["sensorPin1"].style.display = "none";
+ thisContainer["sensorPin2"].style.display = "none";
+ changeWhenTypeOfSensor[1].style.display = "none";
+ changeWhenTypeOfSensor[2].style.display = "none";
+ changeWhenTypeOfSensor[1].innerText = "Sensor 1 ";
+ changeWhenTypeOfSensor[2].innerText = "Sensor 2 ";
+ }
+ };
+
+ let labelElement = document.createElement("label");
+ labelElement.innerText = "Gesamtvolumen (ml) ";
+ con.append(labelElement);
+
+ let selectElement = document.createElement("select");
+ selectElement.classList.add("input");
+ const mls = [50, 100, 200, 250, 300, 330, 500, 750, 1000, 1250, 1500, 2000, 2500, 5000, 10000];
+ for (let ml of mls) {
+ let pinEle = document.createElement("option") as HTMLOptionElement;
+ pinEle.innerText = "" + ml;
+ pinEle.value = "" + ml;
+ selectElement.append(pinEle);
+ thisContainer["volume"] = selectElement;
+ }
+ selectElement.selectedIndex = 7;
+
+ con.append(selectElement);
+
+ let br = document.createElement("br");
+ con.append(br);
+
+ containerEle.append(con);
+ let cast = thisContainer as { container: HTMLDivElement, slot: number, pumpPin: HTMLSelectElement, sensorType: HTMLSelectElement, sensorPin1: HTMLSelectElement, sensorPin2: HTMLSelectElement, volume: HTMLSelectElement };
+ containers.push(cast);
+ console.log(cast);
+ }
+ };
+
+ let div1 = document.createElement("div");
+ div1.style.marginBottom = "2%";
+ modal.addContent(div1);
+ let labelElement = document.createElement("label");
+ labelElement.innerText = "Anzahl Slots";
+ div1.append(labelElement);
+
+ let numberInputElement = document.createElement("input") as HTMLInputElement;
+ numberInputElement.type = "number";
+ numberInputElement.id = "setup_slots";
+ numberInputElement.classList.add("input");
+ numberInputElement.style.width = "20%;"
+ numberInputElement.value = "0";
+ numberInputElement.min = "0";
+ numberInputElement.max = "30";
+ numberInputElement.onchange = () => {
+ onchange();
+ };
+ div1.append(numberInputElement);
+
+ let divContainers = document.createElement("div");
+ divContainers.id = "setup_containers";
+ modal.addContent(divContainers);
+
+ let status = document.createElement("p");
+ status.style.color = "black";
+ status.innerHTML = "Drücke 'Weiter' zum Speichern";
+ modal.addContent(status);
+
+ modal.addButton(ButtonType.SUCCESS, "Weiter", () => {
+ status.innerHTML = "...";
+ status.style.color = "gray";
+ if (numberInputElement.valueAsNumber < 0 || numberInputElement.valueAsNumber > 30) {
+ numberInputElement.value = "0";
+ status.style.color = "black";
+ status.innerHTML = "Automatische Änderungen überprüfen!";
+ return;
+ }
+
+ // Check
+ if (numberInputElement.valueAsNumber != containers.length) {
+ onchange();
+ status.style.color = "black";
+ status.innerHTML = "Automatische Änderungen überprüfen!";
+ return;
+ }
+
+ if (containers.length == 0) {
+ status.style.color = "red";
+ status.innerHTML = "Es muss mindestens ein Container hinzugefügt werden!";
+ return;
+ }
+
+ let newContainers: { slot: number, pumpPin: number, sensorPin1: number, sensorPin2: number, volume: number }[] = [];
+ let ok = true;
+ for (let c of containers) {
+ for (let c2 of containers) {
+ if (c.slot == c.slot) continue;
+
+ let pins = [c.sensorPin1.value, c.sensorPin2.value, c.pumpPin.value, c2.sensorPin1.value, c2.sensorPin2.value, c2.pumpPin.value];
+
+ let i = 0;
+ for (let pin of pins) {
+ let j = 0;
+ if (pin == "-1") {
+ console.log("Skip ", pin);
+ continue;
+ }
+
+ for (let pin2 of pins) {
+ // Wenn index derselbe ist, ignorieren
+ if (j == i) {
+ console.log("Index skip ", pin);
+ continue;
+ }
+
+ if (pin2 == "-1") {
+ console.log("Skip ", pin);
+ continue;
+ }
+
+ if (pin == pin2) {
+ console.log("Pin same error", pin, pin2, c, c2)
+ ok = false;
+ c.container.classList.add("error");
+ c2.container.classList.add("error");
+ setTimeout(() => {
+ c.container.classList.remove("error");
+ c2.container.classList.remove("error");
+ }, 2000);
+ break;
+ }
+
+ j++;
+ }
+ i++;
+ if (!ok) break;
+ }
+ if (!ok) break;
+
+ /*console.log(c, c2);
+ console.log(c.sensorPin2.value == c2.sensorPin2.value);
+ if (
+ c.pumpPin.value == c2.pumpPin.value ||
+ (c.sensorType.value != "0" && (
+ (c.sensorPin1.value == c2.sensorPin1.value)
+ || (c.sensorPin2.value == c2.sensorPin2.value)
+ || (c.sensorPin1.value == c2.sensorPin2.value)
+ || (c.sensorPin2.value == c2.sensorPin1.value)))
+ ) {
+ console.log("Check not ok")
+ ok = false;
+ c.container.classList.add("error");
+ c2.container.classList.add("error");
+ setTimeout(() => {
+ c.container.classList.remove("error");
+ c2.container.classList.remove("error");
+ }, 2000);
+ break;
+ }*/
+ }
+ if (!ok) break;
+
+ if (c.pumpPin.value == "-1" || (c.sensorType.value != "0" && (c.sensorPin1.value == "-1" || c.sensorPin2.value == "-1"))) {
+ console.log("Local check invalid", c);
+ ok = false;
+ c.container.classList.add("error");
+
+ setTimeout(() => {
+ c.container.classList.remove("error");
+
+ }, 1000);
+ }
+
+
+ let pins = [c.sensorPin1.value, c.sensorPin2.value, c.pumpPin.value];
+
+ let i = 0;
+ for (let pin of pins) {
+ let j = 0;
+ if (pin == "-1") {
+ console.log("Skip ", pin);
+ continue;
+ }
+ for (let pin2 of pins) {
+ // Wenn index derselbe ist, ignorieren
+ if (j == i) {
+ console.log("Index skip ", pin);
+ continue;
+ }
+
+ if (pin2 == "-1") {
+ console.log("Skip ", pin);
+ continue;
+ }
+
+ if (pin == pin2) {
+ console.log("Pin same error", pin, pin2, c)
+ ok = false;
+ c.container.classList.add("error");
+ setTimeout(() => {
+ c.container.classList.remove("error");
+ }, 2000);
+ break;
+ }
+
+ j++;
+ }
+ i++;
+ }
+
+ /*if (c.pumpPin.value == c.sensorPin1.value || c.pumpPin.value == c.sensorPin2.value || c.sensorPin1.value == c.sensorPin2.value) {
+ ok = false;
+ c.container.classList.add("error");
+
+ setTimeout(() => {
+ c.container.classList.remove("error");
+
+ }, 1000);
+ break;
+ }*/
+
+ newContainers.push({
+ slot: c.slot,
+ sensorPin1: parseInt(c.sensorPin1.value),
+ sensorPin2: parseInt(c.sensorPin2.value),
+ pumpPin: parseInt(c.pumpPin.value),
+ volume: parseInt(c.volume.value)
+ });
+ }
+ if (!ok) {
+ status.style.color = "red";
+ status.innerHTML = "Problem erkannt Bitte überprüfen, ob alle benötigten Felder gesetzt sind und ob Pins nicht mehrfach belegt sind!"
+ return;
+ }
+
+ // todo Hier konfiguration an Server senden und speichern
+
+ // zurück und hinsenden mittels function die hier in der WebHandler.ts gespeichert wird maybe?
+
+ status.style.color = "green";
+ status.innerHTML = "Konfiguration gespeichert!";
+
+ let tareModal = new Modal("setup", "Setup 2/2");
+
+ let container = document.createElement("div");
+ tareModal.addContent(container);
+
+ let txt = document.createElement("p");
+ txt.innerHTML = `Um das Setup abzuschließen, müssen die Sensoren eingestellt werden.
+Bitte zunächst jegliche Behälter von/unter den Sensoren entfernen. Zum fortfahren "Messen"-Schaltfläche berühren. `;
+ tareModal.addContent(txt);
+
+
+ let btn = tareModal.addButton(ButtonType.SUCCESS, "Messen", () => {
+ txt.innerHTML = "Messung läuft... Gerät nicht berühren!
\n" +
+ " \n" +
+ "
";
+ btn.disabled = true;
+ btn.innerText = "Bitte warten";
+ });
+ // todo send messung to server to start
+
+ tareModal.open();
+ });
+
+ //await modal.open();
+
+ let setupNumber = document.getElementById("setup_slots") as HTMLInputElement;
+ setupNumber.focus();
+ }
+
+ public static openPane(pane: Pane): void {
+ let mainPanel = document.getElementById("main") as HTMLDivElement;
+ let setupPanel = document.getElementById("setup") as HTMLDivElement;
+ let menuPanel = document.getElementById("menu") as HTMLDivElement;
+ let settingsPanel = document.getElementById("settings") as HTMLDivElement;
+
+
+ mainPanel.classList.add("hiddenPane");
+ setupPanel.classList.add("hiddenPane");
+ menuPanel.classList.add("hiddenPane");
+ settingsPanel.classList.add("hiddenPane");
+
+
+ switch (pane) {
+ case Pane.MAIN: {
+ mainPanel.classList.remove("hiddenPane");
+ break;
+ }
+ case Pane.MENU: {
+ menuPanel.classList.remove("hiddenPane");
+ break;
+ }
+ case Pane.SETUP: {
+ setupPanel.classList.remove("hiddenPane");
+ break;
+ }
+ case Pane.SETTINGS: {
+ settingsPanel.classList.remove("hiddenPane");
+ break;
+ }
+ }
+
+ let title = document.getElementById("title") as HTMLTitleElement;
+ title.innerText = pane.toString();
+ }
}
\ No newline at end of file
diff --git a/src/web/WebWebSocketHandler.ts b/src/web/WebWebSocketHandler.ts
index 013387b..adcc809 100644
--- a/src/web/WebWebSocketHandler.ts
+++ b/src/web/WebWebSocketHandler.ts
@@ -42,20 +42,29 @@ export class WebWebSocketHandler {
case iTenderStatus.READY: {
Modal.close("start");
Modal.close("refreshing");
+ Modal.close("setup");
break;
}
case iTenderStatus.STARTING: {
- let modal = new Modal("start", "Willkommen!", `Einen Augenblick bitte iTender startet...`);
+ let modal = new Modal("start", "Willkommen!");
+ let txt = document.createElement("p");
+ txt.innerHTML = `Einen Augenblick bitte iTender startet...`;
+ modal.addContent(txt);
modal.loader = true;
modal.open();
break;
}
case iTenderStatus.REFRESHING: {
- let modal = new Modal("refreshing", "Aktualisieren...", `Einen Augenblick bitte iTender aktualisiert die Getränke...`);
+ let modal = new Modal("refreshing", "Aktualisieren...");
+ let txt = document.createElement("p");
+ txt.innerHTML = `Einen Augenblick bitte iTender aktualisiert die Getränke...`;
+ modal.addContent(txt);
modal.loader = true;
modal.open();
break;
-
+ }
+ case iTenderStatus.SETUP: {
+ WebHandler.openSetup();
}
}
break;
@@ -65,18 +74,22 @@ export class WebWebSocketHandler {
WebHandler.onDrinkUpdate(payload);
break;
}
+
+ case WebSocketEvent.CONTAINERS: {
+ WebHandler.onContainerUpdate(payload);
+ break;
+ }
}
}
private onOpen(event) {
console.log("[WS] Connected", event);
- let connectionElement = document.getElementById("right");
- if (connectionElement)
- {
+ /*let connectionElement = document.getElementById("right");
+ if (connectionElement) {
connectionElement.innerText = "Verbunden";
connectionElement.style.color = "green";
- }
+ }*/
}
@@ -84,14 +97,18 @@ export class WebWebSocketHandler {
console.error("[WS] Closed!", event);
if (event.wasClean) {
let modal = new Modal("socketClosed", "Sitzung beendet!");
- modal.content = `Diese Sitzung wurde beendet, da der iTender nun an einem anderen Gerät bzw. an dem Hauptgerät gesteuert wird.
`;
+ let txt = document.createElement("p");
+ txt.innerHTML = `Diese Sitzung wurde beendet, da der iTender nun an einem anderen Gerät bzw. an dem Hauptgerät gesteuert wird.