- Lab page is now read-only with a settings screen for levels/variants; variant issuance moved to a large modal on the group page (assign-fragment). - Header: bordeaux logo and 2px accent underline, bordeaux login/logout/theme buttons; smaller radii across the UI; filled secondary/danger buttons. - Includes prior agent work (login backoff, no-cache pages, API timeouts, content tweaks) and fixes (variant usage Map.values, import order). - Bump static asset version to v=9.
56 lines
2.9 KiB
HTML
56 lines
2.9 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru" xmlns:th="http://www.thymeleaf.org" th:replace="~{fragments/base :: layout(~{::title}, ~{::#content})}">
|
||
<head><title>Панель — LMS</title></head>
|
||
<body>
|
||
<div id="content">
|
||
<h1 class="page-title">Панель преподавателя</h1>
|
||
|
||
<div class="grid grid-stats">
|
||
<div class="card card-body"><p class="stat-title">Группы</p><p class="stat-value" th:text="${groupCount}">0</p></div>
|
||
<div class="card card-body"><p class="stat-title">Студенты</p><p class="stat-value" th:text="${studentCount}">0</p></div>
|
||
<div class="card card-body"><p class="stat-title">Лабораторные</p><p class="stat-value" th:text="${labCount}">0</p>
|
||
<p class="hint" th:if="${labCount > 0}">опубликовано: <span th:text="${publishedLabs}">0</span></p></div>
|
||
<div class="card card-body"><p class="stat-title">Средний балл</p>
|
||
<p class="stat-value" th:if="${avgGrade != null}" th:text="${#numbers.formatDecimal(avgGrade, 1, 2)}">—</p>
|
||
<p class="stat-value text-muted" th:if="${avgGrade == null}">—</p></div>
|
||
</div>
|
||
|
||
<div class="grid grid-2 mt-8">
|
||
<div>
|
||
<div class="flex items-center justify-between mb-4">
|
||
<h2 class="section-title">Лабораторные</h2>
|
||
<a th:href="@{/admin/labs}" class="text-sm">Все лабораторные →</a>
|
||
</div>
|
||
<div class="card card-flush">
|
||
<table>
|
||
<tbody>
|
||
<tr th:each="lab : ${labs}">
|
||
<td><a th:href="@{/admin/labs/{id}(id=${lab.id})}" th:text="|ЛР ${lab.number}. ${lab.title}|">—</a></td>
|
||
<td class="text-muted" th:text="${lab.variantCount} + ' вар.'">—</td>
|
||
</tr>
|
||
<tr th:if="${#lists.isEmpty(labs)}"><td class="empty">Лабораторных нет.</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<div class="flex items-center justify-between mb-4">
|
||
<h2 class="section-title">Группы</h2>
|
||
<a th:href="@{/admin/groups}" class="text-sm">Все группы →</a>
|
||
</div>
|
||
<div class="card card-flush">
|
||
<table>
|
||
<tbody>
|
||
<tr th:each="group : ${groups}">
|
||
<td><a th:href="@{/admin/groups/{id}(id=${group.id})}" th:text="${group.name}">—</a></td>
|
||
<td class="text-muted" th:text="${group.studentCount} + ' студ.'">—</td>
|
||
</tr>
|
||
<tr th:if="${#lists.isEmpty(groups)}"><td class="empty">Групп нет.</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</body>
|
||
</html> |