// public/main.js – страница записи родителей let allLessons = []; // Загрузка опций для выпадающих списков async function loadFilterOptions() { try { const [classes, teachers, topics] = await Promise.all([ fetch('/api/filter-options/class-names').then(r => r.json()), 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; populateSelect('filterClass', window.allClassNames, 'Все классы'); populateSelect('filterTeacher', window.allTeachers, 'Все учителя'); populateSelect('filterTopic', window.allTopics, 'Все темы'); } catch (err) { console.error('Ошибка загрузки опций фильтров', err); } } function populateSelect(selectId, options, defaultLabel) { const select = document.getElementById(selectId); if (!select) return; const currentValue = select.value; select.innerHTML = ``; options.forEach(opt => { const option = document.createElement('option'); option.value = opt; option.textContent = opt; select.appendChild(option); }); // Восстанавливаем выбранное значение, если оно ещё допустимо if (currentValue && options.includes(currentValue)) { select.value = currentValue; } else { select.value = ''; } } // Загрузка всех уроков с сервера async function loadLessons() { try { const res = await fetch('/api/lessons'); allLessons = await res.json(); updateDependentFilters(); // первоначальное построение зависимых списков applyFilters(); } catch (err) { console.error('Ошибка загрузки уроков', err); document.getElementById('lessonsContainer').innerHTML = '
Ошибка загрузки данных
'; } } // Обновление зависимых выпадающих списков на основе текущих фильтров 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); } if (selectedTeacher) { filteredLessons = filteredLessons.filter(l => l.teacher === selectedTeacher); } if (selectedTopic) { 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'); const oldClass = classSelect.value; const oldTeacher = teacherSelect.value; const oldTopic = topicSelect.value; populateSelect('filterClass', availableClasses, 'Все классы'); 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; else teacherSelect.value = ''; if (oldTopic && availableTopics.includes(oldTopic)) topicSelect.value = oldTopic; 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); renderLessons(filtered); } // Отрисовка карточек уроков + обновление счётчика function renderLessons(lessons) { const container = document.getElementById('lessonsContainer'); const counterSpan = document.getElementById('availableCount'); if (!container) return; if (lessons.length === 0) { container.innerHTML = 'Нет доступных уроков
'; if (counterSpan) counterSpan.textContent = '0'; return; } container.innerHTML = lessons.map(lesson => `Учитель: ${escapeHtml(lesson.teacher)}
Тема: ${escapeHtml(lesson.topic || '—')}