Files
gott/wwwroot/js/pages/login-page.js
T
Meleki 8039b47dec Web-Suche (Agent-Toggle mit Versionswahl), Admin-only Backup, Haiku 4.5
- Agent: Web-Suche als Dropdown (Deaktiviert / 2025 / 2026) statt bool
- AnthropicService: web_search Tool dynamisch nach Version einfügen
- Stream: server_tool_use + web_search_tool_result Events verarbeiten
- Chat-Frontend: web_search_start/end Events mit Suchindikator
- Dashboard: Badge zeigt Web-Suche mit Jahresversion
- UserRecord: IsAdmin Feld, DB-Migration is_admin Spalte
- AuthMiddleware: IsAdmin aus DB laden und in Context setzen
- BackupEndpoint: Admin-Check (403 für Nicht-Admins)
- AuthEndpoint: isAdmin in Login/Me Response
- Frontend: Backup-Section nur für Admins sichtbar
- Haiku 4.5 als Model-Option (Agent-Dropdown + ChatEndpoint)
- TODO: Cronjobs, Haiku ergänzt
2026-03-02 14:05:59 +01:00

50 lines
1.3 KiB
JavaScript

// ── Login Page ──
registerPage('login', {
init() {
const usernameInput = $('#loginUsername');
const passwordInput = $('#loginPassword');
const loginBtn = $('#loginBtn');
const errorDiv = $('#loginError');
async function doLogin() {
errorDiv.hidden = true;
loginBtn.disabled = true;
loginBtn.textContent = 'Anmelden...';
try {
var username = usernameInput.value.trim();
var password = passwordInput.value;
if (!username || !password) {
errorDiv.textContent = 'Benutzername und Passwort eingeben';
errorDiv.hidden = false;
return;
}
currentUser = await apiLogin(username, password);
navigateTo('dashboard');
} catch (err) {
errorDiv.textContent = err.message || 'Login fehlgeschlagen';
errorDiv.hidden = false;
passwordInput.value = '';
passwordInput.focus();
} finally {
loginBtn.disabled = false;
loginBtn.textContent = 'Anmelden';
}
}
loginBtn.addEventListener('click', doLogin);
usernameInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') passwordInput.focus();
});
passwordInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') doLogin();
});
},
destroy() {}
});