Много разных изменений

This commit is contained in:
Zuev
2026-08-20 00:55:27 +03:00
parent 3599d850f6
commit a1c4ee4298
78 changed files with 4698 additions and 428 deletions

View File

@@ -4,6 +4,9 @@ import {
logoutSession,
restoreSession
} from '../auth-session.js';
import { renderScheduleOverview, renderScheduleOverviewState } from '../schedule-overview.js';
import { readUrlState, writeUrlState } from '../admin/js/url-state.js';
import { trackUxEvent } from '../telemetry.js';
(async () => {
const session = await restoreSession();
@@ -16,6 +19,7 @@ import {
const statusLine = document.getElementById('status-line');
const weekLabel = document.getElementById('week-label');
const datePicker = document.getElementById('date-picker');
const scheduleOverview = document.getElementById('schedule-overview');
const absenceForm = document.getElementById('teacher-absence-form');
const absenceList = document.getElementById('teacher-absence-list');
const absenceStatus = document.getElementById('teacher-absence-status');
@@ -45,7 +49,8 @@ import {
let scheduleLessons = new Map();
let activeRequestLesson = null;
let activeCandidates = null;
let weekStart = startOfWeek(new Date());
const pageState = readUrlState({ teacherTab: 'schedule', teacherDate: '' });
let weekStart = startOfWeek(pageState.teacherDate ? parseIsoDate(pageState.teacherDate) : new Date());
document.getElementById('logout-link').addEventListener('click', async (event) => {
event.preventDefault();
@@ -61,14 +66,11 @@ import {
document.documentElement.dataset.theme = localStorage.getItem('theme') || 'light';
document.getElementById('prev-week').addEventListener('click', () => moveWeek(-1));
document.getElementById('today-week').addEventListener('click', () => {
weekStart = startOfWeek(new Date());
loadSchedule();
});
document.getElementById('today-week').addEventListener('click', goToCurrentWeek);
document.getElementById('next-week').addEventListener('click', () => moveWeek(1));
datePicker.addEventListener('change', () => {
if (datePicker.value) {
weekStart = startOfWeek(new Date(datePicker.value));
weekStart = startOfWeek(parseIsoDate(datePicker.value));
loadSchedule();
}
});
@@ -109,7 +111,9 @@ import {
absenceStart.value = todayIso;
absenceEnd.value = todayIso;
switchWorkspace(['schedule', 'preferences', 'requests'].includes(pageState.teacherTab) ? pageState.teacherTab : 'schedule');
loadSchedule();
loadScheduleOverview();
loadAbsences();
loadPreferenceMeta();
loadChangeRequests();
@@ -123,6 +127,39 @@ import {
view.hidden = !active;
view.classList.toggle('active', active);
});
writeUrlState({ teacherTab: name });
trackUxEvent('teacher_workspace_opened', { section: name });
}
function goToCurrentWeek() {
weekStart = startOfWeek(new Date());
loadSchedule();
}
async function loadScheduleOverview() {
if (!teacherId) {
renderScheduleOverviewState(scheduleOverview, { kind: 'error', message: 'Не удалось определить преподавателя' });
return;
}
renderScheduleOverviewState(scheduleOverview, { kind: 'loading' });
const now = new Date();
const startDate = toIsoDate(now);
const endDate = toIsoDate(addDays(now, 14));
try {
const lessons = await fetchJson(`/api/schedule?teacherId=${encodeURIComponent(teacherId)}&startDate=${startDate}&endDate=${endDate}`);
const overview = renderScheduleOverview(scheduleOverview, lessons, {
role: 'teacher',
now,
onGoToday: goToCurrentWeek
});
trackUxEvent('teacher_schedule_overview_loaded', overview);
} catch (error) {
renderScheduleOverviewState(scheduleOverview, {
kind: 'error',
message: error.message,
onRetry: loadScheduleOverview
});
}
}
async function loadPreferenceMeta() {
@@ -533,6 +570,7 @@ import {
const endDate = toIsoDate(addDays(weekStart, 6));
datePicker.value = startDate;
weekLabel.textContent = `${formatDate(weekStart)} - ${formatDate(addDays(weekStart, 6))}`;
writeUrlState({ teacherDate: startDate });
if (!teacherId) {
renderEmptyWeek('Не удалось определить преподавателя');
@@ -546,6 +584,7 @@ import {
scheduleLessons = new Map(lessons.map(lesson => [lessonKey(lesson), lesson]));
renderWeek(lessons);
showStatus(lessons.length ? `Найдено занятий: ${lessons.length}` : 'На этой неделе занятий нет', false);
trackUxEvent('teacher_schedule_loaded', { lessons: lessons.length, startDate });
} catch (error) {
renderEmptyWeek('Ошибка загрузки');
showStatus(error.message, true);
@@ -703,6 +742,11 @@ import {
return copy;
}
function parseIsoDate(value) {
const [year, month, day] = String(value || '').split('-').map(Number);
return year && month && day ? new Date(year, month - 1, day) : new Date();
}
function addDays(date, days) {
const copy = new Date(date);
copy.setDate(copy.getDate() + days);
@@ -807,4 +851,3 @@ import {
.replaceAll("'", ''');
}
})();