Кривая модалка занятий по teacherId добавлена, требует доработки, также код users.js требует унификации+оптимизации(новая модалка вкинута в конец)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user