fix(exam-prep): список «Варианты» показывает метку (ЦТ-2015…), а не «Вариант N»

variants.js хардкодил «Вариант ${n}» в гриде-пикере, заголовке и подписи кнопки,
игнорируя поле label из listVariants (бэкенд его уже отдаёт через examVariantLabel).
Добавлен хелпер labelOf(n) → подставляет v.label с фолбэком. mock.js дропдаун уже
использовал label — там достаточно перезапуска сервера, чтобы бэкенд отдал метки.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-20 19:20:45 +03:00
parent dd69c026ec
commit f381873c34
+9 -3
View File
@@ -34,6 +34,12 @@
const pickerOver = document.getElementById('vp-overlay'); const pickerOver = document.getElementById('vp-overlay');
const pickerGrid = document.getElementById('vp-grid'); const pickerGrid = document.getElementById('vp-grid');
/* Человекочитаемая метка варианта (ЦТ-2015 и т.п.); фолбэк — «Вариант N». */
const labelOf = (n) => {
const v = variants.find(x => x.n === n);
return (v && v.label) || `Вариант ${n}`;
};
/* ── Picker overlay ─────────────────────────────────────────── */ /* ── Picker overlay ─────────────────────────────────────────── */
function buildGrid() { function buildGrid() {
pickerGrid.innerHTML = variants.map(v => { pickerGrid.innerHTML = variants.map(v => {
@@ -45,7 +51,7 @@
const active = v.n === currentN ? ' active' : ''; const active = v.n === currentN ? ' active' : '';
const title = `${v.label} · решено ${v.solved}/${v.total}` + const title = `${v.label} · решено ${v.solved}/${v.total}` +
(v.viewed_sol ? ` · решений открыто ${v.viewed_sol}` : ''); (v.viewed_sol ? ` · решений открыто ${v.viewed_sol}` : '');
return `<button class="vg-btn${cls}${active}" data-n="${v.n}" title="${title}">${v.n}</button>`; return `<button class="vg-btn${cls}${active}" data-n="${v.n}" title="${title}">${v.label || v.n}</button>`;
}).join(''); }).join('');
pickerGrid.querySelectorAll('button[data-n]').forEach(b => { pickerGrid.querySelectorAll('button[data-n]').forEach(b => {
b.onclick = () => { selectVariant(Number(b.dataset.n)); closePicker(); }; b.onclick = () => { selectVariant(Number(b.dataset.n)); closePicker(); };
@@ -74,7 +80,7 @@
/* ── Variant rendering ──────────────────────────────────────── */ /* ── Variant rendering ──────────────────────────────────────── */
async function selectVariant(n) { async function selectVariant(n) {
currentN = n; currentN = n;
pickerLabel.textContent = `Вариант ${n}`; pickerLabel.textContent = labelOf(n);
try { localStorage.setItem(`exam_prep_${examKey}_last_variant`, String(n)); } catch {} try { localStorage.setItem(`exam_prep_${examKey}_last_variant`, String(n)); } catch {}
if (!tasksCache.has(n)) { if (!tasksCache.has(n)) {
@@ -94,7 +100,7 @@
} }
function renderVariant(n, tasks) { function renderVariant(n, tasks) {
main.innerHTML = `<div class="vp-title">Вариант ${n}<small>${tasks.length} заданий</small></div>`; main.innerHTML = `<div class="vp-title">${labelOf(n)}<small>${tasks.length} заданий</small></div>`;
const variantMeta = variants.find(v => v.n === n); const variantMeta = variants.find(v => v.n === n);
const solvedTracked = new Set(); // tasks already solved this session const solvedTracked = new Set(); // tasks already solved this session