VibeCode umgeschrieben

This commit is contained in:
ChK
2026-02-05 17:28:20 +01:00
parent 3e338f6208
commit 926f89a23b

View File

@@ -1,10 +1,10 @@
// ==== app.js ==== // ==== FRONTEND app.js ====
// Service-Liste // Service-Liste
const services = [ const services = [
{ id: "abc", name: "Control GamePad", url: "https://abc.server.schooltech.ch/" }, { id: "abc", name: "Control GamePad", url: "https://abc.server.schooltech.ch/" },
{ id: "xyz", name: "Guacamole", url: "https://xyz.server.schooltech.ch/" }, { id: "xyz", name: "Guacamole", url: "https://xyz.server.schooltech.ch/" },
{ id: "portainer", name: "Portainer", url: "https://portainer.server.schooltech.ch/"} { id: "portainer", name: "Portainer", url: "https://portainer.server.schooltech.ch/" }
]; ];
// DOM-Elemente // DOM-Elemente
@@ -20,12 +20,46 @@ const passwordInput = document.getElementById("password");
let loggedIn = false; let loggedIn = false;
// === Login Modal anzeigen === // ===========================
loginBtn.onclick = () => { // Login anzeigen
loginModal.style.display = "block"; // ===========================
}; function switchToLogin() {
loginBtn.textContent = "Login";
loginBtn.onclick = () => {
loginModal.style.display = "block";
};
}
// === Login-Logik als wiederverwendbare Funktion === // ===========================
// Logout anzeigen
// ===========================
function switchToLogout() {
loginBtn.textContent = "Logout";
loginBtn.onclick = async () => {
try {
await fetch("/api/logout", { method: "POST" });
} catch (e) {
console.warn("Logout request failed:", e);
}
performLocalLogout();
};
}
// ===========================
// Lokales Logout
// ===========================
function performLocalLogout() {
loggedIn = false;
iframe.src = "";
iframe.style.display = "none";
nav.innerHTML = "";
loginModal.style.display = "block";
switchToLogin();
}
// ===========================
// Login-Logik
// ===========================
async function doLogin() { async function doLogin() {
const user = usernameInput.value; const user = usernameInput.value;
const pass = passwordInput.value; const pass = passwordInput.value;
@@ -42,7 +76,7 @@ async function doLogin() {
loginModal.style.display = "none"; loginModal.style.display = "none";
loginMsg.textContent = ""; loginMsg.textContent = "";
setupServiceButtons(); setupServiceButtons();
switchToLogout(); // Button-Text/Handler anpassen (siehe weiter unten) switchToLogout();
} else { } else {
loginMsg.textContent = "Login fehlgeschlagen"; loginMsg.textContent = "Login fehlgeschlagen";
} }
@@ -53,7 +87,7 @@ async function doLogin() {
loginSubmit.onclick = doLogin; loginSubmit.onclick = doLogin;
// Enter / Return auf Passwort- und Benutzerfeld auslösen Login // Enter-Taste Login
[usernameInput, passwordInput].forEach(input => { [usernameInput, passwordInput].forEach(input => {
input.addEventListener('keydown', (e) => { input.addEventListener('keydown', (e) => {
if (e.key === 'Enter') { if (e.key === 'Enter') {
@@ -63,80 +97,57 @@ loginSubmit.onclick = doLogin;
}); });
}); });
// === Service Buttons dynamisch erstellen === // ===========================
// Buttons erzeugen
// ===========================
function setupServiceButtons() { function setupServiceButtons() {
nav.innerHTML = ""; // clear nav.innerHTML = "";
services.forEach(svc => { services.forEach(svc => {
const btn = document.createElement("button"); const btn = document.createElement("button");
btn.textContent = svc.name; btn.textContent = svc.name;
btn.onclick = async () => { btn.onclick = async () => {
console.log('Button clicked, opening', svc.id); try {
try{
await fetch('/api/event', { await fetch('/api/event', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ event: 'open', service: svc.id, url: svc.url }) body: JSON.stringify({
event: 'open',
service: svc.id,
url: svc.url
})
}); });
}catch(e){ console.error('Event log failed', e); } } catch(e) {
console.error('Event log failed', e);
}
openService(svc); openService(svc);
}; };
nav.appendChild(btn); nav.appendChild(btn);
}); });
} }
// === Service in iFrame öffnen === // ===========================
// Service öffnen
// ===========================
function openService(svc) { function openService(svc) {
iframe.src = svc.url; iframe.src = svc.url;
iframe.style.display = "block"; iframe.style.display = "block";
window.scrollTo(0,0); window.scrollTo(0,0);
} }
// Optional: Logout-Funktion // ===========================
function logout() { // Session Status beim Laden prüfen
loggedIn = false; // ===========================
iframe.src = ""; (async function checkStatus() {
iframe.style.display = "none"; try {
nav.innerHTML = ""; const r = await fetch('/api/status');
loginModal.style.display = "block"; if (r.ok) {
} loggedIn = true;
setupServiceButtons();
// Setzt Login-Button so, dass er Logout macht switchToLogout();
function switchToLogout() { } else {
loginBtn.textContent = "Logout"; switchToLogin();
loginBtn.onclick = async () => {
// Option: serverseitiges Logout anstoßen (löscht Cookie / Session)
try {
await fetch("/api/logout", { method: "POST" });
} catch (e) {
console.warn("Logout request failed:", e);
} }
performLocalLogout(); } catch (e) {
}; switchToLogin();
} }
})();
// Setzt Login-Button zurück auf Login (zeigt Modal)
function switchToLogin() {
loginBtn.textContent = "Login";
loginBtn.onclick = () => { loginModal.style.display = "block"; };
}
// Lokale UI-Aufräumarbeiten bei Logout
function performLocalLogout() {
loggedIn = false;
iframe.src = "";
iframe.style.display = "none";
nav.innerHTML = "";
loginModal.style.display = "block";
switchToLogin();
}
// Setzen des Cookies für die Sitzung
function setSessionCookie(res, user) {
res.cookie("SESSIONID", "session-"+user, {
httpOnly: true,
secure: true, // zwingend bei SameSite=None
domain: ".server.schooltech.ch",
sameSite: "None",
path: "/"
});
}