// Settings Page Module
class SettingsPage {
constructor() {
this.settings = {};
this.init();
}
async init() {
// Load settings
await this.loadSettings();
await this.loadSystemInfo();
// Setup event listeners
this.setupEventListeners();
}
async loadSettings() {
try {
// In a real app, this would fetch from /api/settings
this.settings = {
serverPort: 8080,
logLevel: 'info',
dbPath: './data/llm-proxy.db',
backupInterval: 24,
sessionTimeout: 30,
enableRateLimiting: true,
enableCostTracking: true,
enableMetrics: true,
enableWebSocket: true
};
this.renderSettingsForm();
} catch (error) {
console.error('Error loading settings:', error);
}
}
renderSettingsForm() {
const form = document.getElementById('settings-form');
if (!form) return;
// Server port
const portInput = document.getElementById('server-port');
if (portInput) portInput.value = this.settings.serverPort;
// Log level
const logLevelSelect = document.getElementById('log-level');
if (logLevelSelect) logLevelSelect.value = this.settings.logLevel;
// Database path
const dbPathInput = document.getElementById('db-path');
if (dbPathInput) dbPathInput.value = this.settings.dbPath;
// Backup interval
const backupInput = document.getElementById('backup-interval');
if (backupInput) backupInput.value = this.settings.backupInterval;
// Session timeout
const sessionInput = document.getElementById('session-timeout');
if (sessionInput) sessionInput.value = this.settings.sessionTimeout;
}
async loadSystemInfo() {
const container = document.getElementById('system-info');
if (!container) return;
// In a real app, this would fetch system information
const systemInfo = {
version: '1.0.0',
uptime: '5 days, 3 hours',
platform: 'Linux x86_64',
node: 'v18.17.0',
memory: '2.4 GB / 8.0 GB',
disk: '45 GB / 256 GB',
lastBackup: '2024-01-15 02:00:00',
lastRestart: '2024-01-10 14:30:00'
};
container.innerHTML = `
Version:
${systemInfo.version}
Uptime:
${systemInfo.uptime}
Platform:
${systemInfo.platform}
Node.js:
${systemInfo.node}
Memory:
${systemInfo.memory}
Disk:
${systemInfo.disk}
Last Backup:
${systemInfo.lastBackup}
Last Restart:
${systemInfo.lastRestart}
`;
// Add CSS for info grid
this.addInfoStyles();
}
addInfoStyles() {
const style = document.createElement('style');
style.textContent = `
.info-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1rem;
}
.info-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem;
background-color: var(--bg-secondary);
border-radius: var(--border-radius-sm);
}
.info-label {
font-size: 0.875rem;
color: var(--text-secondary);
font-weight: 500;
}
.info-value {
font-size: 0.875rem;
color: var(--text-primary);
font-family: monospace;
}
.form-section {
margin-bottom: 2rem;
padding-bottom: 1.5rem;
border-bottom: 1px solid var(--border-color);
}
.form-section:last-child {
border-bottom: none;
margin-bottom: 0;
}
.form-section h4 {
font-size: 1rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 1rem;
}
`;
document.head.appendChild(style);
}
setupEventListeners() {
// Settings form
const form = document.getElementById('settings-form');
if (form) {
form.addEventListener('submit', (e) => {
e.preventDefault();
this.saveSettings();
});
}
// Reset settings button
const resetBtn = document.getElementById('reset-settings');
if (resetBtn) {
resetBtn.addEventListener('click', () => {
this.resetSettings();
});
}
// Database management buttons
const backupBtn = document.getElementById('backup-db');
if (backupBtn) {
backupBtn.addEventListener('click', () => {
this.backupDatabase();
});
}
const optimizeBtn = document.getElementById('optimize-db');
if (optimizeBtn) {
optimizeBtn.addEventListener('click', () => {
this.optimizeDatabase();
});
}
}
saveSettings() {
// Collect form values
const settings = {
serverPort: parseInt(document.getElementById('server-port').value) || 8080,
logLevel: document.getElementById('log-level').value,
dbPath: document.getElementById('db-path').value,
backupInterval: parseInt(document.getElementById('backup-interval').value) || 24,
sessionTimeout: parseInt(document.getElementById('session-timeout').value) || 30,
dashboardPassword: document.getElementById('dashboard-password').value
};
// Validate settings
if (settings.serverPort < 1024 || settings.serverPort > 65535) {
if (window.authManager) {
window.authManager.showToast('Server port must be between 1024 and 65535', 'error');
}
return;
}
if (settings.backupInterval < 1 || settings.backupInterval > 168) {
if (window.authManager) {
window.authManager.showToast('Backup interval must be between 1 and 168 hours', 'error');
}
return;
}
if (settings.sessionTimeout < 5 || settings.sessionTimeout > 1440) {
if (window.authManager) {
window.authManager.showToast('Session timeout must be between 5 and 1440 minutes', 'error');
}
return;
}
// In a real app, this would save settings via API
this.settings = { ...this.settings, ...settings };
if (window.authManager) {
window.authManager.showToast('Settings saved successfully', 'success');
}
// Clear password field
document.getElementById('dashboard-password').value = '';
}
resetSettings() {
if (confirm('Are you sure you want to reset all settings to default values?')) {
// Reset to defaults
this.settings = {
serverPort: 8080,
logLevel: 'info',
dbPath: './data/llm-proxy.db',
backupInterval: 24,
sessionTimeout: 30,
enableRateLimiting: true,
enableCostTracking: true,
enableMetrics: true,
enableWebSocket: true
};
this.renderSettingsForm();
if (window.authManager) {
window.authManager.showToast('Settings reset to defaults', 'success');
}
}
}
backupDatabase() {
if (window.authManager) {
window.authManager.showToast('Starting database backup...', 'info');
}
// Simulate backup process
setTimeout(() => {
// In a real app, this would trigger a database backup via API
if (window.authManager) {
window.authManager.showToast('Database backup completed successfully', 'success');
}
}, 2000);
}
optimizeDatabase() {
if (confirm('Optimize database? This may improve performance but could take a few moments.')) {
if (window.authManager) {
window.authManager.showToast('Optimizing database...', 'info');
}
// Simulate optimization process
setTimeout(() => {
// In a real app, this would optimize the database via API
if (window.authManager) {
window.authManager.showToast('Database optimization completed', 'success');
}
}, 3000);
}
}
refresh() {
this.loadSettings();
this.loadSystemInfo();
}
}
// Initialize settings page when needed
window.initSettings = async () => {
window.settingsPage = new SettingsPage();
};
// Export for use in other modules
if (typeof module !== 'undefined' && module.exports) {
module.exports = SettingsPage;
}