From 15fe94c32d8e21e4be2cc12c6907d41ab2116fb7 Mon Sep 17 00:00:00 2001 From: Vladislav Kopnin Date: Mon, 28 Sep 2026 17:37:18 +0300 Subject: [PATCH] Admin group: large variant modal with the assigned variant task text --- .../ysu/lms/web/admin/AdminGroupController.kt | 9 ++++- .../main/resources/static/js/admin-group.js | 36 ++++++++++++++++++- .../main/resources/templates/admin/group.html | 6 +++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminGroupController.kt b/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminGroupController.kt index df95d4d..9318ab4 100644 --- a/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminGroupController.kt +++ b/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminGroupController.kt @@ -278,7 +278,14 @@ class AdminGroupController( mapOf( "id" to level.id, "title" to level.title, - "variants" to level.variants.map { v -> mapOf("id" to v.id, "number" to v.number) }, + "variants" to + level.variants.map { v -> + mapOf( + "id" to v.id, + "number" to v.number, + "statementHtml" to markdown.render(v.statementMd), + ) + }, ) }, ) diff --git a/web/src/main/resources/static/js/admin-group.js b/web/src/main/resources/static/js/admin-group.js index 1b67c8b..c639969 100644 --- a/web/src/main/resources/static/js/admin-group.js +++ b/web/src/main/resources/static/js/admin-group.js @@ -195,6 +195,8 @@ function openDefense(btn) { /* ---------- Назначение варианта (вручную или случайно из уровня) ---------- */ +var VARIANT_CACHE = {}; + function openVariant(btn) { var student = btn.getAttribute('data-student') || ''; var lab = btn.getAttribute('data-lab') || ''; @@ -210,6 +212,7 @@ function openVariant(btn) { var levelSel = $id('variant-level'); levelSel.innerHTML = ''; + VARIANT_CACHE = {}; fetch('/admin/labs/' + encodeURIComponent(lab) + '/schema') .then(function (r) { return r.ok ? r.json() : { levels: [] }; }) .then(function (data) { @@ -218,8 +221,19 @@ function openVariant(btn) { opt.value = lvl.id; opt.textContent = lvl.title || ('Уровень ' + (i + 1)); opt.__variants = lvl.variants || []; + (lvl.variants || []).forEach(function (v) { VARIANT_CACHE[v.id] = v; }); levelSel.appendChild(opt); }); + // если вариант уже назначен — открываем уровень, в котором он лежит + if (currentVariant) { + Array.prototype.some.call(levelSel.options, function (opt) { + if ((opt.__variants || []).some(function (v) { return v.id === currentVariant; })) { + levelSel.value = opt.value; + return true; + } + return false; + }); + } levelSel.onchange = function () { fillVariantSelect(currentVariant); }; fillVariantSelect(currentVariant); }); @@ -243,7 +257,27 @@ function fillVariantSelect(currentVariant) { }); $id('variant-random-level').value = levelSel.value || ''; $id('variant-pin-id').value = variantSel.value || ''; - variantSel.onchange = function () { $id('variant-pin-id').value = variantSel.value || ''; }; + variantSel.onchange = function () { + $id('variant-pin-id').value = variantSel.value || ''; + showVariantTask(); + }; + showVariantTask(); +} + +function showVariantTask() { + var variantSel = $id('variant-variant'); + var wrap = $id('variant-task-wrap'); + var box = $id('variant-task'); + if (!wrap || !box) return; + var sel = variantSel.selectedOptions[0]; + var v = sel && VARIANT_CACHE[sel.value]; + if (v && v.statementHtml) { + box.innerHTML = v.statementHtml; + wrap.hidden = false; + } else { + box.innerHTML = ''; + wrap.hidden = true; + } } /* ---------- Таймеры защиты в ячейках ---------- */ diff --git a/web/src/main/resources/templates/admin/group.html b/web/src/main/resources/templates/admin/group.html index 09ff166..5dc73cc 100644 --- a/web/src/main/resources/templates/admin/group.html +++ b/web/src/main/resources/templates/admin/group.html @@ -151,7 +151,7 @@ - +
+