Files
magistr/frontend/teacher/index.html
2026-08-11 01:55:02 +03:00

213 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Кабинет преподавателя</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="shell">
<header class="topbar">
<div class="title">
<h1>Кабинет преподавателя</h1>
<span id="week-label">Загрузка периода...</span>
</div>
<div class="actions">
<button class="btn btn-icon-md btn-secondary" id="theme-toggle-local" type="button" aria-label="Переключить тему">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M21 12.79A9 9 0 1 1 11.21 3a7 7 0 0 0 9.79 9.79z"></path>
</svg>
</button>
<a class="btn btn-danger-subtle" href="/" id="logout-link">Выйти</a>
</div>
</header>
<nav class="workspace-nav" aria-label="Разделы кабинета">
<button class="workspace-tab active" type="button" data-workspace-tab="schedule">Расписание</button>
<button class="workspace-tab" type="button" data-workspace-tab="preferences">Мои пожелания</button>
<button class="workspace-tab" type="button" data-workspace-tab="requests">
Заявки на изменение <span id="change-request-count">0</span>
</button>
</nav>
<section class="workspace-view active" data-workspace-view="schedule">
<section class="toolbar">
<div class="week-nav">
<button class="btn btn-icon-md btn-secondary" id="prev-week" type="button" aria-label="Предыдущая неделя">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<polyline points="15 18 9 12 15 6"></polyline>
</svg>
</button>
<button class="btn btn-md btn-primary" id="today-week" type="button">Сегодня</button>
<button class="btn btn-icon-md btn-secondary" id="next-week" type="button" aria-label="Следующая неделя">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</button>
</div>
<input class="date-input" id="date-picker" type="date" aria-label="Дата недели">
</section>
<div class="status" id="status-line"></div>
<section class="teacher-absence-panel">
<div class="teacher-absence-heading">
<div>
<span>Изменение планов</span>
<h2>Сообщить об отсутствии</h2>
<p>Заявка поступит кафедре на подтверждение. После согласования учебный отдел сможет подобрать замены.</p>
</div>
<button class="btn btn-md btn-secondary" id="absence-form-toggle" type="button" aria-expanded="false">
Новая заявка
</button>
</div>
<form class="teacher-absence-form" id="teacher-absence-form" hidden>
<label>
<span>Начало</span>
<input class="date-input" id="teacher-absence-start" type="date" required>
</label>
<label>
<span>Окончание</span>
<input class="date-input" id="teacher-absence-end" type="date" required>
</label>
<label class="teacher-absence-reason">
<span>Причина</span>
<input id="teacher-absence-reason" type="text" maxlength="2000" placeholder="Например, командировка" required>
</label>
<button class="btn btn-md btn-primary" type="submit">Отправить кафедре</button>
</form>
<div class="teacher-absence-status" id="teacher-absence-status"></div>
<div class="teacher-absence-list" id="teacher-absence-list" aria-live="polite"></div>
</section>
<section class="schedule" id="schedule-grid" aria-live="polite"></section>
</section>
<section class="workspace-view" data-workspace-view="preferences" hidden>
<section class="preference-hero">
<div>
<span class="preference-kicker">Контур доступности</span>
<h2>Соберите ритм семестра до составления расписания</h2>
<p>Строгая недоступность блокирует назначение. Мягкие отметки и пожелания к компактности помогают учебному отделу выбрать удобный вариант.</p>
</div>
<label class="preference-semester-field">
<span>Семестр</span>
<select id="preference-semester"></select>
</label>
</section>
<section class="preference-board">
<header class="preference-board-head">
<div>
<span>Недельный шаблон</span>
<h3>Отмечайте интервалы одним касанием</h3>
</div>
<label>
<span>Режим отметки</span>
<select id="preference-brush">
<option value="SOFT_PREFERRED">Предпочтительно</option>
<option value="SOFT_UNWANTED">Нежелательно</option>
<option value="HARD_UNAVAILABLE">Строго недоступен</option>
</select>
</label>
</header>
<div class="preference-legend" aria-label="Легенда">
<span class="is-preferred">Предпочтительно</span>
<span class="is-unwanted">Нежелательно</span>
<span class="is-hard">Строгий запрет</span>
<span class="is-pending">Ожидает согласования</span>
</div>
<div class="preference-grid-wrap">
<div class="preference-grid" id="preference-grid" aria-live="polite"></div>
</div>
<div class="preference-message" id="preference-message" role="status"></div>
</section>
<div class="preference-lower-grid">
<section class="preference-card">
<span class="preference-card-number">01</span>
<h3>Полная недоступность</h3>
<p>Добавьте отдельную дату внутри семестра — все пары этого дня будут считаться строгим ограничением.</p>
<form id="preference-date-form" class="preference-date-form">
<input type="date" id="preference-date" required>
<input type="text" id="preference-date-comment" maxlength="2000" placeholder="Комментарий (необязательно)">
<button class="btn btn-md btn-primary" type="submit">Добавить дату</button>
</form>
<div class="preference-date-list" id="preference-date-list"></div>
</section>
<section class="preference-card">
<span class="preference-card-number">02</span>
<h3>Компактность недели</h3>
<p>Эти мягкие пожелания не отменяют занятия автоматически, но видны при составлении правил.</p>
<label class="preference-toggle-card">
<input type="checkbox" id="preference-consecutive">
<span><strong>Пары подряд</strong><small>Собирать занятия последовательными блоками</small></span>
</label>
<label class="preference-toggle-card">
<input type="checkbox" id="preference-no-gaps">
<span><strong>Без окон</strong><small>Не оставлять пустые интервалы между занятиями</small></span>
</label>
</section>
</div>
</section>
<section class="workspace-view" data-workspace-view="requests" hidden>
<section class="request-ledger-head">
<div>
<span>Журнал решений</span>
<h2>Заявки на изменение занятий</h2>
<p>Откройте занятие в расписании, чтобы запросить перенос, другую аудиторию или отмену. Здесь сохраняются статус, комментарий и вся история решения.</p>
</div>
<button class="btn btn-md btn-secondary" id="change-request-refresh" type="button">Обновить</button>
</section>
<div class="request-ledger" id="change-request-list" aria-live="polite"></div>
</section>
</main>
<div class="request-dialog-overlay" id="request-dialog-overlay" hidden>
<section class="request-dialog" role="dialog" aria-modal="true" aria-labelledby="request-dialog-title">
<header>
<div>
<span>Предварительная проверка</span>
<h2 id="request-dialog-title">Заявка на изменение</h2>
<p id="request-dialog-lesson">Загрузка занятия...</p>
</div>
<button class="btn btn-icon-md btn-secondary" id="request-dialog-close" type="button" aria-label="Закрыть">×</button>
</header>
<form id="change-request-form">
<label>
<span>Что изменить</span>
<select id="change-request-type">
<option value="MOVE">Перенести дату или время</option>
<option value="CHANGE_CLASSROOM">Сменить аудиторию</option>
<option value="CANCEL">Отменить занятие</option>
</select>
</label>
<label data-request-field="date">
<span>Новая дата</span>
<select id="change-request-date"></select>
</label>
<label data-request-field="time">
<span>Новая пара</span>
<select id="change-request-time"></select>
</label>
<label data-request-field="classroom" hidden>
<span>Новая аудитория</span>
<select id="change-request-classroom"></select>
</label>
<label class="request-reason-field">
<span>Обоснование</span>
<textarea id="change-request-reason" maxlength="2000" rows="4" placeholder="Почему требуется изменение" required></textarea>
</label>
<div class="request-dialog-message" id="request-dialog-message" role="alert"></div>
<footer>
<button class="btn btn-md btn-secondary" id="request-dialog-cancel" type="button">Закрыть</button>
<button class="btn btn-md btn-primary" type="submit">Отправить в учебный отдел</button>
</footer>
</form>
</section>
</div>
<script type="module" src="app.js"></script>
</body>
</html>