- 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
50 lines
1.3 KiB
JavaScript
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() {}
|
|
});
|