Files
gott/wwwroot/js/pages/settings-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

105 lines
3.1 KiB
JavaScript

// ── Settings Page ──
const SETTINGS_KEY = 'settings';
const SETTINGS_DEFAULTS = {
pageWidth: 900,
toolCallDisplay: 'modifications', // 'all' | 'modifications' | 'hidden'
chainMetaDisplay: 'sometimes' // 'always' | 'sometimes' | 'never'
};
function loadSettings() {
try {
const raw = localStorage.getItem(SETTINGS_KEY);
if (raw) return Object.assign({}, SETTINGS_DEFAULTS, JSON.parse(raw));
} catch (_) {}
return Object.assign({}, SETTINGS_DEFAULTS);
}
function saveSettings(settings) {
localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings));
}
function resetSettings() {
localStorage.removeItem(SETTINGS_KEY);
}
function applySettings() {
const s = loadSettings();
document.documentElement.style.setProperty('--page-width', s.pageWidth + 'px');
}
// Apply on load
applySettings();
registerPage('settings', {
init() {
const slider = document.getElementById('settingPageWidth');
const display = document.getElementById('settingPageWidthValue');
const toolCallSelect = document.getElementById('settingToolCallDisplay');
const chainMetaSelect = document.getElementById('settingChainMetaDisplay');
const resetBtn = document.getElementById('settingsResetBtn');
const backupSection = document.getElementById('settingsBackupSection');
// Backup nur für Admins
if (currentUser && currentUser.isAdmin) {
backupSection.style.display = '';
}
const s = loadSettings();
slider.value = s.pageWidth;
display.textContent = s.pageWidth + 'px';
toolCallSelect.value = s.toolCallDisplay;
chainMetaSelect.value = s.chainMetaDisplay;
slider.addEventListener('input', () => {
display.textContent = slider.value + 'px';
});
slider.addEventListener('change', () => {
const s = loadSettings();
s.pageWidth = parseInt(slider.value, 10);
saveSettings(s);
applySettings();
});
toolCallSelect.addEventListener('change', () => {
const s = loadSettings();
s.toolCallDisplay = toolCallSelect.value;
saveSettings(s);
});
chainMetaSelect.addEventListener('change', () => {
const s = loadSettings();
s.chainMetaDisplay = chainMetaSelect.value;
saveSettings(s);
});
const backupBtn = document.getElementById('settingsBackupBtn');
if (backupBtn) backupBtn.addEventListener('click', async () => {
backupBtn.disabled = true;
backupBtn.textContent = 'Wird erstellt...';
try {
await apiBackupDb();
} catch (e) {
console.error('Backup fehlgeschlagen:', e);
} finally {
backupBtn.textContent = 'Jetzt sichern';
backupBtn.disabled = false;
}
});
resetBtn.addEventListener('click', () => {
if (!confirm('Alle Einstellungen auf Standard zurücksetzen?')) return;
resetSettings();
applySettings();
// Update UI
slider.value = SETTINGS_DEFAULTS.pageWidth;
display.textContent = SETTINGS_DEFAULTS.pageWidth + 'px';
toolCallSelect.value = SETTINGS_DEFAULTS.toolCallDisplay;
chainMetaSelect.value = SETTINGS_DEFAULTS.chainMetaDisplay;
});
},
destroy() {}
});