Admin group: large variant modal with the assigned variant task text
This commit is contained in:
@@ -278,7 +278,14 @@ class AdminGroupController(
|
|||||||
mapOf(
|
mapOf(
|
||||||
"id" to level.id,
|
"id" to level.id,
|
||||||
"title" to level.title,
|
"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),
|
||||||
|
)
|
||||||
|
},
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -195,6 +195,8 @@ function openDefense(btn) {
|
|||||||
|
|
||||||
/* ---------- Назначение варианта (вручную или случайно из уровня) ---------- */
|
/* ---------- Назначение варианта (вручную или случайно из уровня) ---------- */
|
||||||
|
|
||||||
|
var VARIANT_CACHE = {};
|
||||||
|
|
||||||
function openVariant(btn) {
|
function openVariant(btn) {
|
||||||
var student = btn.getAttribute('data-student') || '';
|
var student = btn.getAttribute('data-student') || '';
|
||||||
var lab = btn.getAttribute('data-lab') || '';
|
var lab = btn.getAttribute('data-lab') || '';
|
||||||
@@ -210,6 +212,7 @@ function openVariant(btn) {
|
|||||||
|
|
||||||
var levelSel = $id('variant-level');
|
var levelSel = $id('variant-level');
|
||||||
levelSel.innerHTML = '';
|
levelSel.innerHTML = '';
|
||||||
|
VARIANT_CACHE = {};
|
||||||
fetch('/admin/labs/' + encodeURIComponent(lab) + '/schema')
|
fetch('/admin/labs/' + encodeURIComponent(lab) + '/schema')
|
||||||
.then(function (r) { return r.ok ? r.json() : { levels: [] }; })
|
.then(function (r) { return r.ok ? r.json() : { levels: [] }; })
|
||||||
.then(function (data) {
|
.then(function (data) {
|
||||||
@@ -218,8 +221,19 @@ function openVariant(btn) {
|
|||||||
opt.value = lvl.id;
|
opt.value = lvl.id;
|
||||||
opt.textContent = lvl.title || ('Уровень ' + (i + 1));
|
opt.textContent = lvl.title || ('Уровень ' + (i + 1));
|
||||||
opt.__variants = lvl.variants || [];
|
opt.__variants = lvl.variants || [];
|
||||||
|
(lvl.variants || []).forEach(function (v) { VARIANT_CACHE[v.id] = v; });
|
||||||
levelSel.appendChild(opt);
|
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); };
|
levelSel.onchange = function () { fillVariantSelect(currentVariant); };
|
||||||
fillVariantSelect(currentVariant);
|
fillVariantSelect(currentVariant);
|
||||||
});
|
});
|
||||||
@@ -243,7 +257,27 @@ function fillVariantSelect(currentVariant) {
|
|||||||
});
|
});
|
||||||
$id('variant-random-level').value = levelSel.value || '';
|
$id('variant-random-level').value = levelSel.value || '';
|
||||||
$id('variant-pin-id').value = variantSel.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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------- Таймеры защиты в ячейках ---------- */
|
/* ---------- Таймеры защиты в ячейках ---------- */
|
||||||
|
|||||||
@@ -151,7 +151,7 @@
|
|||||||
|
|
||||||
<!-- Диалог: индивидуальное задание (защита) -->
|
<!-- Диалог: индивидуальное задание (защита) -->
|
||||||
<!-- Диалог: назначение варианта -->
|
<!-- Диалог: назначение варианта -->
|
||||||
<dialog id="modal-variant" class="modal">
|
<dialog id="modal-variant" class="modal modal-lg">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h2 class="modal-title">Назначить вариант</h2>
|
<h2 class="modal-title">Назначить вариант</h2>
|
||||||
<button class="modal-close" type="button" onclick="closeModal('modal-variant')">✕</button>
|
<button class="modal-close" type="button" onclick="closeModal('modal-variant')">✕</button>
|
||||||
@@ -162,6 +162,10 @@
|
|||||||
<select class="input" id="variant-level"></select></div>
|
<select class="input" id="variant-level"></select></div>
|
||||||
<div><label class="label" for="variant-variant">Вариант</label>
|
<div><label class="label" for="variant-variant">Вариант</label>
|
||||||
<select class="input" id="variant-variant"></select></div>
|
<select class="input" id="variant-variant"></select></div>
|
||||||
|
<div id="variant-task-wrap" hidden>
|
||||||
|
<label class="label">Текст задания</label>
|
||||||
|
<div id="variant-task" class="md-body"></div>
|
||||||
|
</div>
|
||||||
<div class="flex flex-wrap gap-2">
|
<div class="flex flex-wrap gap-2">
|
||||||
<form class="inline-form" id="variant-random-form" method="post"
|
<form class="inline-form" id="variant-random-form" method="post"
|
||||||
th:action="@{/admin/groups/{gid}/set-level(gid=${group.id})}">
|
th:action="@{/admin/groups/{gid}/set-level(gid=${group.id})}">
|
||||||
|
|||||||
Reference in New Issue
Block a user