hfcg
This commit is contained in:
committed by
GitVerse
parent
ae3227f127
commit
2d007d2359
@@ -2,7 +2,6 @@
|
||||
|
||||
let allLessons = [];
|
||||
|
||||
// Загрузка опций для выпадающих списков
|
||||
async function loadFilterOptions() {
|
||||
try {
|
||||
const [classes, teachers, topics] = await Promise.all([
|
||||
@@ -10,7 +9,6 @@ async function loadFilterOptions() {
|
||||
fetch('/api/filter-options/teachers').then(r => r.json()),
|
||||
fetch('/api/filter-options/topics').then(r => r.json())
|
||||
]);
|
||||
// Сохраняем полные списки для дальнейшей фильтрации
|
||||
window.allClassNames = classes;
|
||||
window.allTeachers = teachers;
|
||||
window.allTopics = topics;
|
||||
@@ -34,7 +32,6 @@ function populateSelect(selectId, options, defaultLabel) {
|
||||
option.textContent = opt;
|
||||
select.appendChild(option);
|
||||
});
|
||||
// Восстанавливаем выбранное значение, если оно ещё допустимо
|
||||
if (currentValue && options.includes(currentValue)) {
|
||||
select.value = currentValue;
|
||||
} else {
|
||||
@@ -42,12 +39,11 @@ function populateSelect(selectId, options, defaultLabel) {
|
||||
}
|
||||
}
|
||||
|
||||
// Загрузка всех уроков с сервера
|
||||
async function loadLessons() {
|
||||
try {
|
||||
const res = await fetch('/api/lessons');
|
||||
allLessons = await res.json();
|
||||
updateDependentFilters(); // первоначальное построение зависимых списков
|
||||
updateDependentFilters();
|
||||
applyFilters();
|
||||
} catch (err) {
|
||||
console.error('Ошибка загрузки уроков', err);
|
||||
@@ -55,13 +51,11 @@ async function loadLessons() {
|
||||
}
|
||||
}
|
||||
|
||||
// Обновление зависимых выпадающих списков на основе текущих фильтров
|
||||
function updateDependentFilters() {
|
||||
const selectedClass = document.getElementById('filterClass').value;
|
||||
const selectedTeacher = document.getElementById('filterTeacher').value;
|
||||
const selectedTopic = document.getElementById('filterTopic').value;
|
||||
|
||||
// Фильтруем уроки по выбранным значениям (если они не пустые)
|
||||
let filteredLessons = allLessons;
|
||||
if (selectedClass) {
|
||||
filteredLessons = filteredLessons.filter(l => l.class_name === selectedClass);
|
||||
@@ -73,12 +67,10 @@ function updateDependentFilters() {
|
||||
filteredLessons = filteredLessons.filter(l => l.topic === selectedTopic);
|
||||
}
|
||||
|
||||
// Извлекаем уникальные значения для каждого поля
|
||||
const availableClasses = [...new Set(filteredLessons.map(l => l.class_name))].sort();
|
||||
const availableTeachers = [...new Set(filteredLessons.map(l => l.teacher))].sort();
|
||||
const availableTopics = [...new Set(filteredLessons.map(l => l.topic).filter(t => t))].sort();
|
||||
|
||||
// Обновляем select, сохраняя текущие значения, если они допустимы
|
||||
const classSelect = document.getElementById('filterClass');
|
||||
const teacherSelect = document.getElementById('filterTeacher');
|
||||
const topicSelect = document.getElementById('filterTopic');
|
||||
@@ -91,7 +83,6 @@ function updateDependentFilters() {
|
||||
populateSelect('filterTeacher', availableTeachers, 'Все учителя');
|
||||
populateSelect('filterTopic', availableTopics, 'Все темы');
|
||||
|
||||
// Если старое значение не было сброшено populateSelect, восстанавливаем
|
||||
if (oldClass && availableClasses.includes(oldClass)) classSelect.value = oldClass;
|
||||
else classSelect.value = '';
|
||||
if (oldTeacher && availableTeachers.includes(oldTeacher)) teacherSelect.value = oldTeacher;
|
||||
@@ -100,16 +91,12 @@ function updateDependentFilters() {
|
||||
else topicSelect.value = '';
|
||||
}
|
||||
|
||||
// Применение фильтров + скрытие уроков без свободных мест
|
||||
function applyFilters() {
|
||||
const classFilter = document.getElementById('filterClass').value;
|
||||
const teacherFilter = document.getElementById('filterTeacher').value;
|
||||
const topicFilter = document.getElementById('filterTopic').value;
|
||||
|
||||
// Сначала отбираем только доступные уроки (есть свободные места)
|
||||
let filtered = allLessons.filter(lesson => lesson.available === true);
|
||||
|
||||
// Точное совпадение для select (не частичное)
|
||||
if (classFilter) filtered = filtered.filter(lesson => lesson.class_name === classFilter);
|
||||
if (teacherFilter) filtered = filtered.filter(lesson => lesson.teacher === teacherFilter);
|
||||
if (topicFilter) filtered = filtered.filter(lesson => lesson.topic === topicFilter);
|
||||
@@ -117,7 +104,6 @@ function applyFilters() {
|
||||
renderLessons(filtered);
|
||||
}
|
||||
|
||||
// Отрисовка карточек уроков + обновление счётчика
|
||||
function renderLessons(lessons) {
|
||||
const container = document.getElementById('lessonsContainer');
|
||||
const counterSpan = document.getElementById('availableCount');
|
||||
@@ -129,16 +115,27 @@ function renderLessons(lessons) {
|
||||
return;
|
||||
}
|
||||
|
||||
container.innerHTML = lessons.map(lesson => `
|
||||
<div class="lesson-card" data-id="${lesson.id}">
|
||||
<h3>${escapeHtml(lesson.class_name)} | ${escapeHtml(lesson.subject)}</h3>
|
||||
<p><strong>Учитель:</strong> ${escapeHtml(lesson.teacher)}</p>
|
||||
<p><strong>Тема:</strong> ${escapeHtml(lesson.topic || '—')}</p>
|
||||
<div class="slots">
|
||||
Свободных мест: ${lesson.max_slots - lesson.current_slots} из ${lesson.max_slots}
|
||||
container.innerHTML = lessons.map(lesson => {
|
||||
// Определяем, что показывать в строке времени
|
||||
let timeHtml = '';
|
||||
if (lesson.topic === 'Консультация' && lesson.date && lesson.time) {
|
||||
timeHtml = `<p><strong>Дата/время:</strong> ${escapeHtml(lesson.date)} ${escapeHtml(lesson.time)}</p>`;
|
||||
} else {
|
||||
timeHtml = `<p><strong>Время:</strong> Согласно расписания</p>`;
|
||||
}
|
||||
|
||||
return `
|
||||
<div class="lesson-card" data-id="${lesson.id}">
|
||||
<h3>${escapeHtml(lesson.class_name)} | ${escapeHtml(lesson.subject)}</h3>
|
||||
<p><strong>Учитель:</strong> ${escapeHtml(lesson.teacher)}</p>
|
||||
<p><strong>Тема:</strong> ${escapeHtml(lesson.topic || '—')}</p>
|
||||
${timeHtml}
|
||||
<div class="slots">
|
||||
Свободных мест: ${lesson.max_slots - lesson.current_slots}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`).join('');
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
if (counterSpan) counterSpan.textContent = `${lessons.length}`;
|
||||
|
||||
@@ -147,7 +144,6 @@ function renderLessons(lessons) {
|
||||
});
|
||||
}
|
||||
|
||||
// Модальное окно записи (без изменений)
|
||||
function setupModal() {
|
||||
const modal = document.getElementById('modal');
|
||||
const closeSpan = modal.querySelector('.close');
|
||||
@@ -195,11 +191,18 @@ function openModal(lessonId) {
|
||||
const lesson = allLessons.find(l => l.id == lessonId);
|
||||
if (!lesson) return;
|
||||
|
||||
let timeInfo = '';
|
||||
if (lesson.topic === 'Консультация' && lesson.date && lesson.time) {
|
||||
timeInfo = `${lesson.date} ${lesson.time}`;
|
||||
} else {
|
||||
timeInfo = 'Согласно расписания';
|
||||
}
|
||||
|
||||
document.getElementById('lessonId').value = lessonId;
|
||||
document.getElementById('modalLessonInfo').innerHTML = `
|
||||
<strong>${escapeHtml(lesson.class_name)}</strong><br>
|
||||
${escapeHtml(lesson.subject)} — ${escapeHtml(lesson.teacher)}<br>
|
||||
<small>${lesson.date} ${lesson.time}</small>
|
||||
<small>${timeInfo}</small>
|
||||
`;
|
||||
document.getElementById('modalMessage').innerHTML = '';
|
||||
document.getElementById('registrationForm').reset();
|
||||
@@ -216,13 +219,11 @@ function escapeHtml(str) {
|
||||
});
|
||||
}
|
||||
|
||||
// Инициализация
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
await loadFilterOptions();
|
||||
await loadLessons();
|
||||
setupModal();
|
||||
|
||||
// Обработчики изменений фильтров
|
||||
const classSelect = document.getElementById('filterClass');
|
||||
const teacherSelect = document.getElementById('filterTeacher');
|
||||
const topicSelect = document.getElementById('filterTopic');
|
||||
|
||||
Reference in New Issue
Block a user