feat(web): ведомость преподавателя, материалы курса и аудит

This commit is contained in:
2026-10-27 20:39:28 +03:00
parent 4d97feaf9e
commit 97e14f040c
20 changed files with 1542 additions and 124 deletions

View File

@@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="ru" xmlns:th="http://www.thymeleaf.org" th:replace="~{fragments/base :: layout(~{::title}, ~{::#content})}">
<head><title th:text="${article.title} + ' — LMS'">Статья</title></head>
<body>
<div id="content">
<nav class="text-sm mb-4 breadcrumb">
<a th:href="@{/teacher/courses/{id}(id=${course.id})}" class="nav-link" th:text="${course.title}">Курс</a>
<span class="nav-sep">/</span>
<a th:href="@{/teacher/courses/{courseId}/content(courseId=${course.id})}"
class="nav-link">Материалы</a>
<span class="nav-sep">/</span>
<span th:text="${article.chapterTitle}">Глава</span>
<span class="nav-sep">/</span>
<span th:text="${article.sectionTitle}">Раздел</span>
<span class="nav-sep">/</span>
<span th:text="${article.title}">Статья</span>
</nav>
<div class="page-head mb-2">
<div>
<h1 class="page-title m-0">
<span th:text="${article.title}">Статья</span>
<span class="badge"
th:classappend="${article.published ? 'badge-ok' : 'badge-warn'}"
th:text="${article.published ? 'опубликовано' : 'скрыто от студентов'}">—</span>
</h1>
<div class="meta mt-2">
<span th:text="|${course.title} / ${article.chapterTitle} / ${article.sectionTitle}|">Курс</span>
</div>
</div>
</div>
<div class="flex flex-wrap gap-2 mb-4">
<a class="btn btn-sm btn-secondary" th:href="${back}">← К материалам курса</a>
<a class="btn btn-sm btn-secondary"
th:if="${course.courseNo != null and course.courseNo > 0}"
th:href="@{/learn/course/{no}/{chapter}/{section}/{article}(no=${course.courseNo}, chapter=${article.chapterSlug}, section=${article.sectionSlug}, article=${article.slug})}">
Студенческий вид
</a>
<form class="inline-form"
th:action="@{/teacher/courses/{courseId}/content/articles/{id}/published(courseId=${course.id}, id=${article.id})}"
method="post">
<input type="hidden" name="_csrf" th:value="${csrfToken}">
<input type="hidden" name="published" th:value="${!article.published}">
<input type="hidden" name="back" th:value="${back}">
<button class="btn btn-sm btn-secondary" type="submit"
th:text="${article.published ? 'Скрыть от студентов' : 'Опубликовать'}">Опубликовать</button>
</form>
<form class="inline-form"
th:action="@{/teacher/courses/{courseId}/content/articles/{id}/delete(courseId=${course.id}, id=${article.id})}"
method="post" data-confirm="Удалить статью?">
<input type="hidden" name="_csrf" th:value="${csrfToken}">
<input type="hidden" name="back" th:value="${back}">
<button class="btn btn-sm btn-danger" type="submit">Удалить</button>
</form>
</div>
<div class="row g-4">
<div class="col-12 col-lg-7">
<form class="card card-body form-stack"
th:action="@{/teacher/courses/{courseId}/content/articles/{id}/save(courseId=${course.id}, id=${article.id})}"
method="post">
<input type="hidden" name="_csrf" th:value="${csrfToken}">
<input type="hidden" name="back" th:value="${back}">
<div>
<label class="label" for="articleTitle">Заголовок</label>
<input class="input" id="articleTitle" name="title" th:value="${article.title}" required>
</div>
<div>
<label class="label" for="articleBodyMd">Текст (markdown)</label>
<textarea class="input md-editor-body" id="articleBodyMd" name="bodyMd"
rows="18" th:text="${article.bodyMd}"></textarea>
</div>
<button class="btn btn-primary" type="submit">Сохранить</button>
</form>
</div>
<div class="col-12 col-lg-5">
<div class="card card-body">
<h2 class="section-title m-0">Предпросмотр</h2>
<div class="md-body mt-2" th:utext="${bodyHtml}">Предпросмотр статьи</div>
</div>
</div>
</div>
</div>
</body>
</html>