Кривая модалка занятий по teacherId добавлена, требует доработки, также код users.js требует унификации+оптимизации(новая модалка вкинута в конец)

This commit is contained in:
2026-03-13 03:12:48 +03:00
parent 24caa148e1
commit 8df736ae36
3 changed files with 370 additions and 3 deletions

View File

@@ -172,8 +172,13 @@ export async function initUsers() {
<td>${u.id}</td>
<td>${escapeHtml(u.username)}</td>
<td><span class="badge ${ROLE_BADGE[u.role] || ''}">${ROLE_LABELS[u.role] || escapeHtml(u.role)}</span></td>
<td><button class="btn-delete" data-id="${u.id}">Удалить</button></td>
<td><button class="btn-add-lesson" data-id="${u.id}">Добавить занятие</button></td>
<td>
<button class="btn-delete" data-id="${u.id}">Удалить</button>
</td>
<td>
<button class="btn-add-lesson" data-id="${u.id}">Добавить занятие</button>
<button class="btn-view-lessons" data-id="${u.id}" data-name="${escapeHtml(u.username)}" style="margin-left: 0.5rem;">👁️ Занятия</button>
</td>
</tr>`).join('');
}
@@ -351,4 +356,158 @@ export async function initUsers() {
// Загружаем все данные при инициализации
await Promise.all([loadUsers(), loadGroups(), loadSubjects(), loadClassrooms()]);
}
// Элементы второго модального окна
const modalViewLessons = document.getElementById('modal-view-lessons');
const modalViewLessonsClose = document.getElementById('modal-view-lessons-close');
const lessonsContainer = document.getElementById('lessons-container');
const modalTeacherName = document.getElementById('modal-teacher-name');
// Функция для загрузки и отображения занятий преподавателя
async function loadTeacherLessons(teacherId, teacherName) {
try {
lessonsContainer.innerHTML = '<div class="loading-lessons">Загрузка занятий...</div>';
// Устанавливаем имя преподавателя в заголовок
if (teacherName) {
modalTeacherName.textContent = `Занятия преподавателя: ${teacherName}`;
} else {
modalTeacherName.textContent = 'Занятия преподавателя';
}
// Загружаем занятия
const lessons = await api.get(`/api/users/lessons/${teacherId}`);
if (!lessons || lessons.length === 0) {
lessonsContainer.innerHTML = '<div class="no-lessons">У преподавателя пока нет занятий</div>';
return;
}
// Группируем занятия по дням недели
const daysOrder = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'];
const lessonsByDay = {};
lessons.forEach(lesson => {
if (!lessonsByDay[lesson.day]) {
lessonsByDay[lesson.day] = [];
}
lessonsByDay[lesson.day].push(lesson);
});
// Сортируем занятия в каждом дне по времени
Object.keys(lessonsByDay).forEach(day => {
lessonsByDay[day].sort((a, b) => {
// Простая сортировка по времени (можно улучшить)
return a.time.localeCompare(b.time);
});
});
// Формируем HTML
let html = '';
daysOrder.forEach(day => {
if (lessonsByDay[day]) {
html += `<div class="lesson-day-divider">${day}</div>`;
lessonsByDay[day].forEach(lesson => {
html += `
<div class="lesson-card">
<div class="lesson-card-header">
<span class="lesson-group">${escapeHtml(lesson.groupName)}</span>
<span class="lesson-time">${escapeHtml(lesson.time)}</span>
</div>
<div class="lesson-card-body">
<div class="lesson-subject">${escapeHtml(lesson.subjectName)}</div>
<div class="lesson-details">
<span class="lesson-detail-item">${escapeHtml(lesson.typeLesson)}</span>
<span class="lesson-detail-item">${escapeHtml(lesson.lessonFormat)}</span>
<span class="lesson-detail-item">${escapeHtml(lesson.week)}</span>
<span class="lesson-detail-item">${escapeHtml(lesson.classroomName)}</span>
</div>
</div>
</div>
`;
});
}
});
lessonsContainer.innerHTML = html;
} catch (e) {
lessonsContainer.innerHTML = `<div class="no-lessons">Ошибка загрузки: ${escapeHtml(e.message)}</div>`;
console.error('Ошибка загрузки занятий:', e);
}
}
// Функция открытия модального окна
function openViewLessonsModal(teacherId, teacherName) {
loadTeacherLessons(teacherId, teacherName);
modalViewLessons.classList.add('open');
// Блокируем скролл страницы
document.body.style.overflow = 'hidden';
}
// Функция закрытия модального окна
function closeViewLessonsModal() {
modalViewLessons.classList.remove('open');
document.body.style.overflow = '';
}
// Обработчик кликов по таблице (добавляем в существующий)
// Найдите в коде usersTbody.addEventListener('click', ...) и добавьте в него:
// ДОЛЖНО ПОЛУЧИТЬСЯ ТАК:
usersTbody.addEventListener('click', async (e) => {
const deleteBtn = e.target.closest('.btn-delete');
if (deleteBtn) {
if (!confirm('Удалить пользователя?')) return;
try {
await api.delete('/api/users/' + deleteBtn.dataset.id);
loadUsers();
} catch (e) {
alert(e.message || 'Ошибка удаления');
}
return;
}
const addLessonBtn = e.target.closest('.btn-add-lesson');
if (addLessonBtn) {
e.preventDefault();
if (modalAddLesson) {
openAddLessonModal(addLessonBtn.dataset.id);
}
return;
}
// НОВЫЙ ОБРАБОТЧИК для кнопки просмотра занятий
const viewLessonsBtn = e.target.closest('.btn-view-lessons');
if (viewLessonsBtn) {
e.preventDefault();
const teacherId = viewLessonsBtn.dataset.id;
const teacherName = viewLessonsBtn.dataset.name;
openViewLessonsModal(teacherId, teacherName);
}
});
// Обработчики закрытия модального окна
if (modalViewLessonsClose) {
modalViewLessonsClose.addEventListener('click', closeViewLessonsModal);
}
// Закрытие по клику на overlay
if (modalViewLessons) {
modalViewLessons.addEventListener('click', (e) => {
if (e.target === modalViewLessons) {
closeViewLessonsModal();
}
});
}
// Закрытие по Escape
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && modalViewLessons?.classList.contains('open')) {
closeViewLessonsModal();
}
});
}