Создание вкладки "Расписание занятий"

This commit is contained in:
alekan
2026-03-03 00:02:07 +03:00
parent 2004766855
commit 88f1abfe25
4 changed files with 83 additions and 0 deletions

View File

@@ -86,6 +86,15 @@
</svg> </svg>
Дисциплины Дисциплины
</a> </a>
<a href="#" class="nav-item" data-tab="schedule">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect>
<line x1="16" y1="2" x2="16" y2="6"></line>
<line x1="8" y1="2" x2="8" y2="6"></line>
<line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
Расписание занятий
</a>
</nav> </nav>
<div class="sidebar-footer"> <div class="sidebar-footer">
<button class="btn-logout" id="btn-logout"> <button class="btn-logout" id="btn-logout">

View File

@@ -7,6 +7,7 @@ import { initEduForms } from './views/edu-forms.js';
import { initEquipments } from './views/equipments.js'; import { initEquipments } from './views/equipments.js';
import { initClassrooms } from './views/classrooms.js'; import { initClassrooms } from './views/classrooms.js';
import { initSubjects } from './views/subjects.js'; import { initSubjects } from './views/subjects.js';
import {initSchedule} from "./views/schedule.js";
// Configuration // Configuration
const ROUTES = { const ROUTES = {
@@ -16,6 +17,8 @@ const ROUTES = {
equipments: { title: 'Оборудование', file: 'views/equipments.html', init: initEquipments }, equipments: { title: 'Оборудование', file: 'views/equipments.html', init: initEquipments },
classrooms: { title: 'Аудитории', file: 'views/classrooms.html', init: initClassrooms }, classrooms: { title: 'Аудитории', file: 'views/classrooms.html', init: initClassrooms },
subjects: { title: 'Дисциплины и преподаватели', file: 'views/subjects.html', init: initSubjects }, subjects: { title: 'Дисциплины и преподаватели', file: 'views/subjects.html', init: initSubjects },
// Новая вкладка
schedule: { title: 'Расписание занятий', file: 'views/schedule.html', init: initSchedule },
}; };
let currentTab = null; let currentTab = null;

View File

@@ -0,0 +1,48 @@
import { api } from '../api.js';
import { escapeHtml } from '../utils.js';
export async function initSchedule() {
const tbody = document.getElementById('schedule-tbody');
async function loadSchedule() {
try {
// Предполагается, что на сервере есть endpoint GET /api/lessons,
// возвращающий массив объектов с полями:
// id, teacher (объект с username), group (объект с name),
// subject (объект с name), day, week, time.
const lessons = await api.get('/api/users/lessons');
renderSchedule(lessons);
} catch (e) {
tbody.innerHTML = `<tr><td colspan="7" class="loading-row">Ошибка загрузки: ${escapeHtml(e.message)}</td></tr>`;
}
}
function renderSchedule(lessons) {
if (!lessons || !lessons.length) {
tbody.innerHTML = '<tr><td colspan="7" class="loading-row">Нет занятий</td></tr>';
return;
}
tbody.innerHTML = lessons.map(lesson => {
// Извлекаем имена из вложенных объектов или используем запасные поля
const teacherName = lesson.teacher?.username || lesson.teacherName || '—';
const groupName = lesson.group?.name || lesson.groupName || '—';
const subjectName = lesson.subject?.name || lesson.subjectName || '—';
const day = lesson.day || '—';
const week = lesson.week || '—';
const time = lesson.time || '—';
return `<tr>
<td>${escapeHtml(lesson.id)}</td>
<td>${escapeHtml(teacherName)}</td>
<td>${escapeHtml(groupName)}</td>
<td>${escapeHtml(subjectName)}</td>
<td>${escapeHtml(day)}</td>
<td>${escapeHtml(week)}</td>
<td>${escapeHtml(time)}</td>
</tr>`;
}).join('');
}
await loadSchedule();
}

View File

@@ -0,0 +1,23 @@
<div class="card">
<h2>Расписание занятий</h2>
<div class="table-wrap">
<table id="schedule-table">
<thead>
<tr>
<th>ID</th>
<th>Преподаватель</th>
<th>Группа</th>
<th>Дисциплина</th>
<th>День недели</th>
<th>Неделя</th>
<th>Время</th>
</tr>
</thead>
<tbody id="schedule-tbody">
<tr>
<td colspan="7" class="loading-row">Загрузка...</td>
</tr>
</tbody>
</table>
</div>
</div>