From f381873c34d44b90ba35f665dc15f778b3b90c29 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 20 Jun 2026 19:20:45 +0300 Subject: [PATCH] =?UTF-8?q?fix(exam-prep):=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=BA=20=C2=AB=D0=92=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82?= =?UTF-8?q?=D1=8B=C2=BB=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BC=D0=B5=D1=82=D0=BA=D1=83=20(=D0=A6=D0=A2-2?= =?UTF-8?q?015=E2=80=A6),=20=D0=B0=20=D0=BD=D0=B5=20=C2=AB=D0=92=D0=B0?= =?UTF-8?q?=D1=80=D0=B8=D0=B0=D0=BD=D1=82=20N=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit variants.js хардкодил «Вариант ${n}» в гриде-пикере, заголовке и подписи кнопки, игнорируя поле label из listVariants (бэкенд его уже отдаёт через examVariantLabel). Добавлен хелпер labelOf(n) → подставляет v.label с фолбэком. mock.js дропдаун уже использовал label — там достаточно перезапуска сервера, чтобы бэкенд отдал метки. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/js/exam-prep/variants.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/js/exam-prep/variants.js b/frontend/js/exam-prep/variants.js index c492acc..16aad2f 100644 --- a/frontend/js/exam-prep/variants.js +++ b/frontend/js/exam-prep/variants.js @@ -34,6 +34,12 @@ const pickerOver = document.getElementById('vp-overlay'); 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 ─────────────────────────────────────────── */ function buildGrid() { pickerGrid.innerHTML = variants.map(v => { @@ -45,7 +51,7 @@ const active = v.n === currentN ? ' active' : ''; const title = `${v.label} · решено ${v.solved}/${v.total}` + (v.viewed_sol ? ` · решений открыто ${v.viewed_sol}` : ''); - return ``; + return ``; }).join(''); pickerGrid.querySelectorAll('button[data-n]').forEach(b => { b.onclick = () => { selectVariant(Number(b.dataset.n)); closePicker(); }; @@ -74,7 +80,7 @@ /* ── Variant rendering ──────────────────────────────────────── */ async function selectVariant(n) { currentN = n; - pickerLabel.textContent = `Вариант ${n}`; + pickerLabel.textContent = labelOf(n); try { localStorage.setItem(`exam_prep_${examKey}_last_variant`, String(n)); } catch {} if (!tasksCache.has(n)) { @@ -94,7 +100,7 @@ } function renderVariant(n, tasks) { - main.innerHTML = `
Вариант ${n}${tasks.length} заданий
`; + main.innerHTML = `
${labelOf(n)}${tasks.length} заданий
`; const variantMeta = variants.find(v => v.n === n); const solvedTracked = new Set(); // tasks already solved this session