- Scheduler Nachrichten: Template-Variablen {time}, {date}, {datetime},
{weekday}, {nodes}, {nodes_24h} serverseitig aufgelöst
- Scheduler UI: klickbare Variablen-Badges beim Nachrichtenfeld-Modus
- Footer auf allen Seiten: © MeshDD / PPfeiffer · vX.Y.Z · MM/YYYY
- Fix: WS-Verbindungen vor runner.cleanup() explizit geschlossen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
126 lines
6.7 KiB
HTML
126 lines
6.7 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de" data-bs-theme="dark">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>MeshDD-Bot Login</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/@tabler/core@1.4.0/dist/css/tabler.min.css" rel="stylesheet">
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet">
|
|
<link rel="stylesheet" href="/static/css/style.css">
|
|
</head>
|
|
<body class="antialiased">
|
|
<!-- Top Navbar -->
|
|
<nav class="top-navbar d-flex align-items-center px-3">
|
|
<span class="fw-bold me-auto">
|
|
<i class="bi bi-broadcast-pin text-info me-1"></i>MeshDD-Bot
|
|
</span>
|
|
<button class="btn btn-sm btn-outline-secondary py-0 px-1" id="themeToggle" title="Theme wechseln">
|
|
<i class="bi bi-sun-fill" id="themeIcon" style="font-size:.75rem"></i>
|
|
</button>
|
|
</nav>
|
|
|
|
<!-- Content (centered, no sidebar) -->
|
|
<main style="margin-top:48px;min-height:calc(100vh - 48px);display:flex;align-items:center;justify-content:center;background:var(--tblr-bg-body,var(--bs-body-bg))">
|
|
<div style="width:100%;max-width:400px;padding:1rem">
|
|
|
|
<!-- Login Form -->
|
|
<div id="loginView">
|
|
<div class="card card-outline card-info">
|
|
<div class="card-header text-center">
|
|
<i class="bi bi-person-lock me-1"></i>Anmelden
|
|
</div>
|
|
<div class="card-body">
|
|
<div id="loginAlert" class="alert alert-danger py-1 small d-none"></div>
|
|
<div class="mb-3">
|
|
<label for="loginEmail" class="form-label small">E-Mail</label>
|
|
<input type="email" class="form-control form-control-sm" id="loginEmail" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="loginPassword" class="form-label small">Passwort</label>
|
|
<input type="password" class="form-control form-control-sm" id="loginPassword" required>
|
|
</div>
|
|
<button class="btn btn-info btn-sm w-100" id="btnLogin">Anmelden</button>
|
|
<div class="mt-2 text-center small">
|
|
<a href="#" id="showRegister" class="text-decoration-none">Registrieren</a>
|
|
<span class="text-body-secondary mx-1">|</span>
|
|
<a href="#" id="showForgot" class="text-decoration-none">Passwort vergessen</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Register Form -->
|
|
<div id="registerView" class="d-none">
|
|
<div class="card card-outline card-success">
|
|
<div class="card-header text-center">
|
|
<i class="bi bi-person-plus me-1"></i>Registrieren
|
|
</div>
|
|
<div class="card-body">
|
|
<div id="registerAlert" class="alert py-1 small d-none"></div>
|
|
<div class="mb-3">
|
|
<label for="registerName" class="form-label small">Name</label>
|
|
<input type="text" class="form-control form-control-sm" id="registerName" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="registerEmail" class="form-label small">E-Mail</label>
|
|
<input type="email" class="form-control form-control-sm" id="registerEmail" required>
|
|
</div>
|
|
<button class="btn btn-success btn-sm w-100" id="btnRegister">Registrieren</button>
|
|
<div class="mt-2 text-center small">
|
|
<a href="#" id="showLoginFromReg" class="text-decoration-none">Zurueck zum Login</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Forgot Password Form -->
|
|
<div id="forgotView" class="d-none">
|
|
<div class="card card-outline card-warning">
|
|
<div class="card-header text-center">
|
|
<i class="bi bi-key me-1"></i>Passwort vergessen
|
|
</div>
|
|
<div class="card-body">
|
|
<div id="forgotAlert" class="alert py-1 small d-none"></div>
|
|
<div class="mb-3">
|
|
<label for="forgotEmail" class="form-label small">E-Mail</label>
|
|
<input type="email" class="form-control form-control-sm" id="forgotEmail" required>
|
|
</div>
|
|
<button class="btn btn-warning btn-sm w-100" id="btnForgot">Link senden</button>
|
|
<div class="mt-2 text-center small">
|
|
<a href="#" id="showLoginFromForgot" class="text-decoration-none">Zurueck zum Login</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Set Password Form (verify + reset) -->
|
|
<div id="setPasswordView" class="d-none">
|
|
<div class="card card-outline card-primary">
|
|
<div class="card-header text-center">
|
|
<i class="bi bi-shield-lock me-1"></i><span id="setPasswordTitle">Passwort setzen</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<div id="setPasswordAlert" class="alert py-1 small d-none"></div>
|
|
<div class="mb-3">
|
|
<label for="newPassword" class="form-label small">Neues Passwort (min. 8 Zeichen)</label>
|
|
<input type="password" class="form-control form-control-sm" id="newPassword" minlength="8" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="confirmPassword" class="form-label small">Passwort wiederholen</label>
|
|
<input type="password" class="form-control form-control-sm" id="confirmPassword" minlength="8" required>
|
|
</div>
|
|
<button class="btn btn-primary btn-sm w-100" id="btnSetPassword">Passwort speichern</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</main>
|
|
|
|
<footer id="pageFooter" class="page-footer" style="left:0"></footer>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
|
<script src="/static/js/login.js"></script>
|
|
</body>
|
|
</html>
|