// public/k.js – управление привязкой учителей к корпусам let currentUser = null; let teachersList = []; // [{ id, name, subject, campus }] document.addEventListener('DOMContentLoaded', async () => { await checkAuth(); await loadTeachers(); setupEventListeners(); }); async function checkAuth() { try { const res = await fetch('/api/me'); const data = await res.json(); if (!data.authenticated || data.user.role !== 'admin') { window.location.href = '/login.html'; return; } currentUser = data.user; document.getElementById('userInfo').innerHTML = `👋 ${currentUser.full_name} (${currentUser.role})`; } catch (err) { window.location.href = '/login.html'; } } async function loadTeachers() { try { const res = await fetch('/api/teachers'); teachersList = await res.json(); renderTable(); } catch (err) { console.error(err); document.getElementById('tableBody').innerHTML = 'Ошибка загрузки'; } } function renderTable() { const tbody = document.getElementById('tableBody'); if (!teachersList.length) { tbody.innerHTML = 'Нет учителей'; return; } tbody.innerHTML = teachersList.map(teacher => ` ${escapeHtml(teacher.name)} ${escapeHtml(teacher.subject || '—')} `).join(''); } async function saveAllChanges() { const updates = []; document.querySelectorAll('.campus-select').forEach(select => { const teacherId = parseInt(select.dataset.id); const newCampus = select.value; updates.push({ id: teacherId, campus: newCampus }); }); const messageDiv = document.getElementById('message'); messageDiv.style.display = 'block'; messageDiv.className = 'message'; messageDiv.innerHTML = 'Сохранение...'; try { const res = await fetch('/api/teachers/campus/batch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ updates }) }); const data = await res.json(); if (res.ok) { messageDiv.className = 'message success'; messageDiv.innerHTML = '✅ Изменения сохранены'; setTimeout(() => messageDiv.style.display = 'none', 3000); // обновляем локальные данные teachersList = teachersList.map(t => { const update = updates.find(u => u.id === t.id); if (update) t.campus = update.campus; return t; }); } else { throw new Error(data.error || 'Ошибка сохранения'); } } catch (err) { messageDiv.className = 'message error'; messageDiv.innerHTML = `❌ Ошибка: ${err.message}`; setTimeout(() => messageDiv.style.display = 'none', 3000); } } function setupEventListeners() { document.getElementById('saveAllBtn')?.addEventListener('click', saveAllChanges); document.getElementById('logoutBtn')?.addEventListener('click', async () => { await fetch('/api/logout', { method: 'POST' }); window.location.href = '/'; }); } function escapeHtml(str) { if (!str) return ''; return str.replace(/[&<>]/g, function(m) { if (m === '&') return '&'; if (m === '<') return '<'; if (m === '>') return '>'; return m; }); }