Изменил страницу "Кафедра", добавлена фильтрация и добавление блоков
This commit is contained in:
@@ -233,3 +233,4 @@ details.table-item .content td{
|
|||||||
details.table-item .content{
|
details.table-item .content{
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,4 +1,121 @@
|
|||||||
import { api } from '../api.js';
|
import { api } from '../api.js';
|
||||||
import { escapeHtml } from '../utils.js';
|
import { escapeHtml, showAlert, hideAlert } from '../utils.js';
|
||||||
|
|
||||||
export async function initDepartment() { }
|
export async function initDepartment() {
|
||||||
|
const form = document.getElementById('department-schedule-form');
|
||||||
|
const departmentSelect = document.getElementById('filter-department');
|
||||||
|
const container = document.getElementById('schedule-blocks-container');
|
||||||
|
|
||||||
|
let departments = [];
|
||||||
|
|
||||||
|
// Загрузка кафедр
|
||||||
|
try {
|
||||||
|
departments = await api.get('/api/departments');
|
||||||
|
departmentSelect.innerHTML = '<option value="">Выберите кафедру...</option>' +
|
||||||
|
departments.map(d => `<option value="${d.id}">${escapeHtml(d.departmentName || d.name)}</option>`).join('');
|
||||||
|
} catch (e) {
|
||||||
|
departmentSelect.innerHTML = '<option value="">Ошибка загрузки</option>';
|
||||||
|
}
|
||||||
|
|
||||||
|
form.addEventListener('submit', async (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
hideAlert('schedule-form-alert');
|
||||||
|
|
||||||
|
const departmentId = departmentSelect.value;
|
||||||
|
const period = document.getElementById('filter-period').value;
|
||||||
|
const semesterType = document.querySelector('input[name="semesterType"]:checked')?.value;
|
||||||
|
|
||||||
|
if (!departmentId || !period || !semesterType) {
|
||||||
|
showAlert('schedule-form-alert', 'Заполните все поля', 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const deptName = departmentSelect.options[departmentSelect.selectedIndex].text;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const params = new URLSearchParams({
|
||||||
|
departmentId,
|
||||||
|
semesterType,
|
||||||
|
period
|
||||||
|
});
|
||||||
|
|
||||||
|
// Запрос на бэк
|
||||||
|
const data = await api.get(`/api/department/schedule?${params.toString()}`);
|
||||||
|
|
||||||
|
const semesterName = semesterType === 'spring' ? 'весенний' : (semesterType === 'autumn' ? 'осенний' : semesterType);
|
||||||
|
const periodName = period.replace('-', '/'); // Display 2024-2025 as 2024/2025
|
||||||
|
|
||||||
|
renderScheduleBlock(deptName, semesterName, periodName, data);
|
||||||
|
|
||||||
|
form.reset();
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
showAlert('schedule-form-alert', err.message || 'Ошибка загрузки данных', 'error');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function renderScheduleBlock(deptName, semester, period, schedule) {
|
||||||
|
const details = document.createElement('details');
|
||||||
|
details.className = 'table-item';
|
||||||
|
details.open = true; // Сразу открываем новый блок
|
||||||
|
|
||||||
|
details.innerHTML = `
|
||||||
|
<summary>
|
||||||
|
<div class="chev" aria-hidden="true">
|
||||||
|
<svg viewBox="0 0 20 20" class="chev-icon" focusable="false" aria-hidden="true">
|
||||||
|
<path d="M5.5 7.5L10 12l4.5-4.5" fill="none" stroke="currentColor" stroke-width="2"
|
||||||
|
stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="title title-multiline">
|
||||||
|
<span class="title-main">Данные к составлению расписания</span>
|
||||||
|
<span class="title-sub">Кафедра: <b>${escapeHtml(deptName)}</b></span>
|
||||||
|
<span class="title-sub">Семестр: <b>${escapeHtml(semester)}</b></span>
|
||||||
|
<span class="title-sub">Уч. год: <b>${escapeHtml(period)}</b></span>
|
||||||
|
</div>
|
||||||
|
<div class="meta">${schedule ? schedule.length : 0} записей</div>
|
||||||
|
</summary>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Специальность</th>
|
||||||
|
<th>Курс/семестр</th>
|
||||||
|
<th>Группа</th>
|
||||||
|
<th>Дисциплина</th>
|
||||||
|
<th>Вид занятий</th>
|
||||||
|
<th>Часов в неделю</th>
|
||||||
|
<th>Аудитория</th>
|
||||||
|
<th>Фамилия преподавателя</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
${renderRows(schedule)}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
container.prepend(details);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderRows(schedule) {
|
||||||
|
if (!schedule || schedule.length === 0) {
|
||||||
|
return '<tr><td colspan="8" class="loading-row">Нет данных</td></tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return schedule.map(r => `
|
||||||
|
<tr>
|
||||||
|
<td>${escapeHtml(r.specialty || '-')}</td>
|
||||||
|
<td>${escapeHtml(r.courseSemester || '-')}</td>
|
||||||
|
<td>${escapeHtml(r.groupName || '-')}</td>
|
||||||
|
<td>${escapeHtml(r.subjectName || '-')}</td>
|
||||||
|
<td>${escapeHtml(r.lessonType || '-')}</td>
|
||||||
|
<td>${escapeHtml(r.hours || '-')}</td>
|
||||||
|
<td>${escapeHtml(r.classroom || '-')}</td>
|
||||||
|
<td>${escapeHtml(r.teacherName || '-')}</td>
|
||||||
|
</tr>
|
||||||
|
`).join('');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,193 +1,46 @@
|
|||||||
<div class="card">
|
<div class="card create-card">
|
||||||
<h2>Кафедра</h2>
|
<h2>Запрос расписания кафедры</h2>
|
||||||
|
<form id="department-schedule-form">
|
||||||
<div class="filter-row" style="gap:.75rem;">
|
<div class="form-row">
|
||||||
<label for="recordsSearch">Поиск</label>
|
<div class="form-group">
|
||||||
<input
|
<label for="filter-department">Кафедра</label>
|
||||||
id="recordsSearch"
|
<select id="filter-department" required>
|
||||||
class="records-search"
|
<option value="">Загрузка...</option>
|
||||||
type="search"
|
</select>
|
||||||
placeholder="Группа, дисциплина, преподаватель…"
|
|
||||||
autocomplete="off"
|
|
||||||
/>
|
|
||||||
<button type="button" class="btn-delete" id="recordsSearchClear">Сброс</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Семестр</label>
|
||||||
|
<div style="display: flex; gap: 0.2rem;">
|
||||||
|
<label class="btn-checkbox">
|
||||||
|
<input type="radio" name="semesterType" value="autumn" id="sem-autumn" required>
|
||||||
|
<span class="checkbox-btn">Осенний</span>
|
||||||
|
</label>
|
||||||
|
<label class="btn-checkbox">
|
||||||
|
<input type="radio" name="semesterType" value="spring" id="sem-spring" required>
|
||||||
|
<span class="checkbox-btn">Весенний</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="filter-period">Учебный год</label>
|
||||||
|
<select id="filter-period" required>
|
||||||
|
<option value="">Выберите...</option>
|
||||||
|
<option value="2022-2023">2022/2023</option>
|
||||||
|
<option value="2023-2024">2023/2024</option>
|
||||||
|
<option value="2024-2025">2024/2025</option>
|
||||||
|
<option value="2025-2026">2025/2026</option>
|
||||||
|
<option value="2026-2027">2026/2027</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" class="btn-primary" style="align-self: flex-end;">Запросить</button>
|
||||||
|
</div>
|
||||||
|
<div class="form-alert" id="schedule-form-alert" role="alert"></div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="table-wrap" id="schedule-blocks-container">
|
||||||
<div class="table-wrap">
|
<!-- Сгенерированные блоки таблиц будут появляться здесь -->
|
||||||
|
|
||||||
<!-- Таблица 1 -->
|
|
||||||
<details class="table-item">
|
|
||||||
<summary>
|
|
||||||
<div class="chev" aria-hidden="true">
|
|
||||||
<svg viewBox="0 0 20 20" class="chev-icon" focusable="false" aria-hidden="true">
|
|
||||||
<path d="M5.5 7.5L10 12l4.5-4.5" fill="none" stroke="currentColor" stroke-width="2"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class="title title-multiline">
|
|
||||||
<span class="title-main">Данные к составлению расписания</span>
|
|
||||||
<span class="title-sub">Кафедра: <b>Информационная безопасность</b></span>
|
|
||||||
<span class="title-sub">Факультет: <b>ФиПИ</b></span>
|
|
||||||
<span class="title-sub">Семестр: <b>весенний</b></span>
|
|
||||||
<span class="title-sub">Уч. год: <b>2024/2025</b></span>
|
|
||||||
</div>
|
|
||||||
<div class="meta">3 записи</div>
|
|
||||||
</summary>
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Специальность</th>
|
|
||||||
<th>Курс и семестр</th>
|
|
||||||
<th>Группа</th>
|
|
||||||
<th>Дисциплина</th>
|
|
||||||
<th>Вид занятий</th>
|
|
||||||
<th>Часов в неделю</th>
|
|
||||||
<th>Деление на подгруппы</th>
|
|
||||||
<th>Фамилия преподавателя</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
|
|
||||||
<tbody>
|
|
||||||
<!-- 1 строка = 1 запись HARDCODE -->
|
|
||||||
<tr>
|
|
||||||
<td>09.02.07</td>
|
|
||||||
<td>2 курс, 4 семестр</td>
|
|
||||||
<td>ИС-21</td>
|
|
||||||
<td>Базы данных</td>
|
|
||||||
<td>Лабораторная</td>
|
|
||||||
<td>2</td>
|
|
||||||
<td>Да</td>
|
|
||||||
<td>Иванов</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>09.02.07</td>
|
|
||||||
<td>2 курс, 4 семестр</td>
|
|
||||||
<td>ИС-22</td>
|
|
||||||
<td>Операционные системы</td>
|
|
||||||
<td>Практика</td>
|
|
||||||
<td>1</td>
|
|
||||||
<td>Нет</td>
|
|
||||||
<td>Смирнов</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>09.02.07</td>
|
|
||||||
<td>1 курс, 2 семестр</td>
|
|
||||||
<td>ИС-12</td>
|
|
||||||
<td>Алгоритмы</td>
|
|
||||||
<td>Лекция</td>
|
|
||||||
<td>2</td>
|
|
||||||
<td>Нет</td>
|
|
||||||
<td>Кузнецов</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<!-- Таблица 2 -->
|
|
||||||
<details class="table-item">
|
|
||||||
<summary>
|
|
||||||
<div class="chev" aria-hidden="true">
|
|
||||||
<svg viewBox="0 0 20 20" class="chev-icon" focusable="false" aria-hidden="true">
|
|
||||||
<path d="M5.5 7.5L10 12l4.5-4.5" fill="none" stroke="currentColor" stroke-width="2"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class="title">orders</div>
|
|
||||||
<div class="meta">1 запись</div>
|
|
||||||
</summary>
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Специальность</th>
|
|
||||||
<th>Курс и семестр</th>
|
|
||||||
<th>Группа</th>
|
|
||||||
<th>Дисциплина</th>
|
|
||||||
<th>Вид занятий</th>
|
|
||||||
<th>Часов в неделю</th>
|
|
||||||
<th>Деление на подгруппы</th>
|
|
||||||
<th>Фамилия преподавателя</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>38.02.01</td>
|
|
||||||
<td>1 курс, 1 семестр</td>
|
|
||||||
<td>ЭК-11</td>
|
|
||||||
<td>Экономика</td>
|
|
||||||
<td>Лекция</td>
|
|
||||||
<td>1</td>
|
|
||||||
<td>Нет</td>
|
|
||||||
<td>Петров</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<!-- Таблица 3 -->
|
|
||||||
<details class="table-item">
|
|
||||||
<summary>
|
|
||||||
<div class="chev" aria-hidden="true">
|
|
||||||
<svg viewBox="0 0 20 20" class="chev-icon" focusable="false" aria-hidden="true">
|
|
||||||
<path d="M5.5 7.5L10 12l4.5-4.5" fill="none" stroke="currentColor" stroke-width="2"
|
|
||||||
stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class="title">products</div>
|
|
||||||
<div class="meta">2 записи</div>
|
|
||||||
</summary>
|
|
||||||
|
|
||||||
<div class="content">
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Специальность</th>
|
|
||||||
<th>Курс и семестр</th>
|
|
||||||
<th>Группа</th>
|
|
||||||
<th>Дисциплина</th>
|
|
||||||
<th>Вид занятий</th>
|
|
||||||
<th>Часов в неделю</th>
|
|
||||||
<th>Деление на подгруппы</th>
|
|
||||||
<th>Фамилия преподавателя</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>15.02.08</td>
|
|
||||||
<td>3 курс, 6 семестр</td>
|
|
||||||
<td>МС-31</td>
|
|
||||||
<td>Материаловедение</td>
|
|
||||||
<td>Практика</td>
|
|
||||||
<td>3</td>
|
|
||||||
<td>Да</td>
|
|
||||||
<td>Сидоров</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>15.02.08</td>
|
|
||||||
<td>3 курс, 6 семестр</td>
|
|
||||||
<td>МС-32</td>
|
|
||||||
<td>Технология металлов</td>
|
|
||||||
<td>Лабораторная</td>
|
|
||||||
<td>2</td>
|
|
||||||
<td>Да</td>
|
|
||||||
<td>Орлов</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</details>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
Reference in New Issue
Block a user