Bootstrap 5.3 as CSS base + B3 theme layer; dialogs isolated as .dlg; offcanvas sidebar; icons via SVG assets + masks

This commit is contained in:
2026-10-02 23:44:00 +03:00
parent 24b72a2525
commit 9a4e11e5ba
12 changed files with 185 additions and 179 deletions

View File

@@ -148,12 +148,12 @@
</div>
<!-- Диалог: оценка + комментарии -->
<dialog id="modal-grade" class="modal modal-lg">
<div class="modal-header">
<h2 class="modal-title" id="grade-title">Оценка и комментарии</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-grade" class="dlg dlg-lg">
<div class="dlg-header">
<h2 class="dlg-title" id="grade-title">Оценка и комментарии</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" id="grade-form" th:action="@{/admin/groups/{id}/grades(id=${group.id})}" method="post">
<input type="hidden" name="_csrf" th:value="${csrfToken}">
<input type="hidden" name="studentId" id="grade-student">
@@ -173,12 +173,12 @@
<!-- Диалог: индивидуальное задание (защита) -->
<!-- Диалог: назначение варианта -->
<dialog id="modal-variant" class="modal modal-lg">
<div class="modal-header">
<h2 class="modal-title">Назначить вариант</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-variant" class="dlg dlg-lg">
<div class="dlg-header">
<h2 class="dlg-title">Назначить вариант</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body form-stack">
<div class="dlg-body form-stack">
<p class="text-sm text-muted" id="variant-who">—</p>
<div><label class="label" for="variant-level">Уровень</label>
<select class="input" id="variant-level"></select></div>
@@ -209,12 +209,12 @@
</div>
</dialog>
<dialog id="modal-defense" class="modal">
<div class="modal-header">
<h2 class="modal-title">Индивидуальное задание</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-defense" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title">Индивидуальное задание</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" id="defense-form" th:action="@{/admin/defenses/save}" method="post">
<input type="hidden" name="_csrf" th:value="${csrfToken}">
<input type="hidden" name="groupId" th:value="${group.id}">
@@ -257,12 +257,12 @@
<!-- Диалог добавления студента -->
<dialog id="modal-add-student" class="modal">
<div class="modal-header">
<h2 class="modal-title">Добавить студента</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-add-student" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title">Добавить студента</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" id="enroll-form" method="post"
th:action="@{/admin/groups/{gid}/students/enroll(gid=${group.id})}">
<input type="hidden" name="_csrf" th:value="${csrfToken}">
@@ -336,12 +336,12 @@
</div>
<!-- Большая модалка «Выдача вариантов»: содержимое подгружается фрагментом по лабе -->
<dialog id="modal-lab-assign" class="modal modal-lg">
<div class="modal-header">
<h2 class="modal-title" id="assign-modal-title">Выдача вариантов</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-lab-assign" class="dlg dlg-lg">
<div class="dlg-header">
<h2 class="dlg-title" id="assign-modal-title">Выдача вариантов</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body" id="assign-modal-body"></div>
<div class="dlg-body" id="assign-modal-body"></div>
</dialog>
<script th:src="@{/js/admin-group.js(v='15')}" defer></script>

View File

@@ -27,12 +27,12 @@
</table>
</div>
<dialog id="modal-create-group" class="modal">
<div class="modal-header">
<h2 class="modal-title">Новая группа</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-create-group" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title">Новая группа</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" th:action="@{/admin/groups}" method="post">
<div><label class="label" for="name">Название</label>
<input class="input" id="name" name="name" placeholder="ПИ-11БО" required autofocus></div>
@@ -42,12 +42,12 @@
</div>
</dialog>
<dialog id="modal-import-group" class="modal">
<div class="modal-header">
<h2 class="modal-title">Импорт студентов</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-import-group" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title">Импорт студентов</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" th:action="@{/admin/groups/import}" method="post" enctype="multipart/form-data">
<p class="text-sm text-muted">Файл .xls, .xlsx или .csv со столбцами: студенческий номер, ФИО, основа обучения. Логин — студенческий номер, пароль сгенерируется и покажется после импорта.</p>
<div><label class="label" for="file">Файл со списком</label>

View File

@@ -128,12 +128,12 @@
</div>
<div th:each="level : ${lab.levels}" th:remove="tag">
<dialog th:id="|modal-level-rename-${level.id}|" class="modal">
<div class="modal-header">
<h2 class="modal-title">Переименовать уровень</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog th:id="|modal-level-rename-${level.id}|" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title">Переименовать уровень</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" th:action="@{/admin/labs/{labId}/levels/save(labId=${lab.id})}" method="post">
<input type="hidden" name="_csrf" th:value="${csrfToken}">
<input type="hidden" name="levelId" th:value="${level.id}">
@@ -144,12 +144,12 @@
</form>
</div>
</dialog>
<dialog th:id="|modal-variant-add-${level.id}|" class="modal">
<div class="modal-header">
<h2 class="modal-title" th:text="|Новый вариант — ${level.title}|">Новый вариант</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog th:id="|modal-variant-add-${level.id}|" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title" th:text="|Новый вариант — ${level.title}|">Новый вариант</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" th:action="@{/admin/labs/{labId}/variants/save(labId=${lab.id})}"
method="post">
<input type="hidden" name="_csrf" th:value="${csrfToken}">
@@ -168,12 +168,12 @@
</div>
</dialog>
<th:block th:each="v : ${level.variants}">
<dialog th:id="|modal-variant-edit-${v.id}|" class="modal">
<div class="modal-header">
<h2 class="modal-title" th:text="|Вариант ${v.number}|">Вариант</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog th:id="|modal-variant-edit-${v.id}|" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title" th:text="|Вариант ${v.number}|">Вариант</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" th:action="@{/admin/labs/{labId}/variants/save(labId=${lab.id})}"
method="post">
<input type="hidden" name="_csrf" th:value="${csrfToken}">

View File

@@ -49,12 +49,12 @@
</div>
<dialog id="modal-import-lab" class="modal">
<div class="modal-header">
<h2 class="modal-title">Импорт лабораторной</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-import-lab" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title">Импорт лабораторной</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" th:action="@{/admin/labs/import}" method="post" enctype="multipart/form-data">
<div><label class="label" for="labFile">Файл</label>
<input class="input" id="labFile" type="file" name="file" accept=".zip" required></div>
@@ -72,12 +72,12 @@
</div>
</dialog>
<dialog id="modal-create-lab" class="modal">
<div class="modal-header">
<h2 class="modal-title">Новая лабораторная</h2>
<button class="modal-close" type="button" aria-label="Закрыть">✕</button>
<dialog id="modal-create-lab" class="dlg">
<div class="dlg-header">
<h2 class="dlg-title">Новая лабораторная</h2>
<button class="dlg-close" type="button" aria-label="Закрыть">✕</button>
</div>
<div class="modal-body">
<div class="dlg-body">
<form class="form-stack" th:action="@{/admin/labs/create}" method="post">
<div class="grid grid-2">
<div><label class="label" for="labNumber">Номер</label>