import { api } from '../api.js'; import { escapeHtml, showAlert, hideAlert } from '../utils.js'; export async function initSubjects() { const subjectsTbody = document.getElementById('subjects-tbody'); const createSubjectForm = document.getElementById('create-subject-form'); const assignTeacherForm = document.getElementById('assign-teacher-form'); const assignTeacherSelect = document.getElementById('assign-teacher-select'); const assignSubjectSelect = document.getElementById('assign-subject-select'); const teacherSubjectsTbody = document.getElementById('teacher-subjects-tbody'); let allSubjects = []; let allTeachers = []; async function loadInitialData() { await Promise.all([loadSubjects(), loadTeachers()]); await loadTeacherSubjects(); } async function loadSubjects() { try { allSubjects = await api.get('/api/subjects'); renderSubjects(allSubjects); populateSubjectSelect(allSubjects); } catch (e) { if (subjectsTbody) subjectsTbody.innerHTML = 'Ошибка загрузки'; } } function renderSubjects(subjects) { if (!subjects || !subjects.length) { subjectsTbody.innerHTML = 'Нет дисциплин'; return; } subjectsTbody.innerHTML = subjects.map(s => ` ${s.id} ${escapeHtml(s.name)} `).join(''); } function populateSubjectSelect(subjects) { if (!assignSubjectSelect) return; const currentVal = assignSubjectSelect.value; assignSubjectSelect.innerHTML = '' + subjects.map(s => ``).join(''); if (currentVal && subjects.find(s => s.id == currentVal)) { assignSubjectSelect.value = currentVal; } } async function loadTeachers() { try { allTeachers = await api.get('/api/users/teachers'); populateTeacherSelect(allTeachers); } catch (e) { if (assignTeacherSelect) assignTeacherSelect.innerHTML = ''; } } function populateTeacherSelect(teachers) { if (!assignTeacherSelect) return; const currentVal = assignTeacherSelect.value; if (!teachers || !teachers.length) { assignTeacherSelect.innerHTML = ''; return; } assignTeacherSelect.innerHTML = '' + teachers.map(t => ``).join(''); if (currentVal && teachers.find(t => t.id == currentVal)) { assignTeacherSelect.value = currentVal; } } async function loadTeacherSubjects() { try { const tsData = await api.get('/api/teacher-subjects'); renderTeacherSubjects(tsData); } catch (e) { if (teacherSubjectsTbody) teacherSubjectsTbody.innerHTML = 'Ошибка загрузки'; } } function renderTeacherSubjects(tsArray) { if (!tsArray || !tsArray.length) { teacherSubjectsTbody.innerHTML = 'Нет привязок'; return; } teacherSubjectsTbody.innerHTML = tsArray.map(ts => ` ${escapeHtml(ts.username)} ${escapeHtml(ts.subjectName)} `).join(''); } createSubjectForm.addEventListener('submit', async (e) => { e.preventDefault(); hideAlert('create-subject-alert'); const name = document.getElementById('new-subject-name').value.trim(); if (!name) { showAlert('create-subject-alert', 'Введите название', 'error'); return; } try { const data = await api.post('/api/subjects', { name }); showAlert('create-subject-alert', `Дисциплина "${escapeHtml(data.name)}" добавлена`, 'success'); createSubjectForm.reset(); loadSubjects(); } catch (e) { showAlert('create-subject-alert', e.message || 'Ошибка создания', 'error'); } }); subjectsTbody.addEventListener('click', async (e) => { const btn = e.target.closest('.btn-delete'); if (!btn) return; if (!confirm('Удалить дисциплину?')) return; try { await api.delete('/api/subjects/' + btn.dataset.id); loadSubjects(); loadTeacherSubjects(); // May have deleted a subject that was assigned } catch (e) { alert(e.message || 'Ошибка удаления'); } }); assignTeacherForm.addEventListener('submit', async (e) => { e.preventDefault(); hideAlert('assign-teacher-alert'); const userId = assignTeacherSelect.value; const subjectId = assignSubjectSelect.value; if (!userId) { showAlert('assign-teacher-alert', 'Выберите преподавателя', 'error'); return; } if (!subjectId) { showAlert('assign-teacher-alert', 'Выберите дисциплину', 'error'); return; } try { await api.post('/api/teacher-subjects', { userId: Number(userId), subjectId: Number(subjectId) }); showAlert('assign-teacher-alert', 'Привязка создана', 'success'); loadTeacherSubjects(); } catch (e) { showAlert('assign-teacher-alert', e.message || 'Ошибка привязки', 'error'); } }); teacherSubjectsTbody.addEventListener('click', async (e) => { const btn = e.target.closest('.btn-delete'); if (!btn) return; if (!confirm('Удалить привязку?')) return; try { await api.delete('/api/teacher-subjects', { userId: Number(btn.dataset.userId), subjectId: Number(btn.dataset.subjectId) }); loadTeacherSubjects(); } catch (e) { alert(e.message || 'Ошибка удаления'); } }); loadInitialData(); }