/** * LogBoard+ - Скрипт страницы входа * Автор: Сергей Антропов * Сайт: https://devops.org.ru */ /** * Инициализация переключателя темы * Загружает сохраненную тему из localStorage и настраивает переключатель */ (function initTheme(){ const saved = localStorage.lb_theme || 'dark'; document.documentElement.setAttribute('data-theme', saved); document.getElementById('themeSwitch').checked = (saved==='light'); document.getElementById('themeSwitch').addEventListener('change', ()=>{ const t = document.getElementById('themeSwitch').checked ? 'light' : 'dark'; document.documentElement.setAttribute('data-theme', t); localStorage.lb_theme = t; }); })(); /** * Обработчик переключения видимости пароля * Показывает/скрывает пароль и меняет иконку */ document.getElementById('passwordToggle').addEventListener('click', function() { const passwordInput = document.getElementById('password'); const icon = this.querySelector('i'); if (passwordInput.type === 'password') { passwordInput.type = 'text'; icon.className = 'fas fa-eye-slash'; } else { passwordInput.type = 'password'; icon.className = 'fas fa-eye'; } }); /** * Обработчик отправки формы входа * Выполняет аутентификацию пользователя через API */ document.getElementById('loginForm').addEventListener('submit', async function(e) { e.preventDefault(); const username = document.getElementById('username').value.trim(); const password = document.getElementById('password').value; const loginButton = document.getElementById('loginButton'); const buttonText = document.getElementById('buttonText'); const loadingSpinner = document.getElementById('loadingSpinner'); const errorMessage = document.getElementById('errorMessage'); // Validation if (!username || !password) { showError('Пожалуйста, заполните все поля'); return; } // Show loading state loginButton.disabled = true; buttonText.textContent = 'Вход...'; loadingSpinner.classList.add('show'); hideError(); try { const response = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ username: username, password: password }) }); if (response.ok) { const data = await response.json(); // Store token in localStorage localStorage.setItem('access_token', data.access_token); // Redirect to main page window.location.href = '/'; } else { const errorData = await response.json(); showError(errorData.detail || 'Ошибка входа в систему'); } } catch (error) { console.error('Login error:', error); showError('Ошибка соединения с сервером'); } finally { // Reset loading state loginButton.disabled = false; buttonText.textContent = 'Войти'; loadingSpinner.classList.remove('show'); } }); /** * Показывает сообщение об ошибке * @param {string} message - Текст ошибки */ function showError(message) { const errorMessage = document.getElementById('errorMessage'); errorMessage.textContent = message; errorMessage.classList.add('show'); } /** * Скрывает сообщение об ошибке */ function hideError() { const errorMessage = document.getElementById('errorMessage'); errorMessage.classList.remove('show'); } /** * Автофокус на поле имени пользователя при загрузке страницы */ document.addEventListener('DOMContentLoaded', function() { document.getElementById('username').focus(); }); // Handle Enter key in password field document.getElementById('password').addEventListener('keypress', function(e) { if (e.key === 'Enter') { document.getElementById('loginForm').dispatchEvent(new Event('submit')); } });