From 9a13a19e63300e04d09c3b4330838a445411a007 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 19 Jun 2026 08:31:45 +0300 Subject: [PATCH] =?UTF-8?q?feat(ctmath):=20=D1=87=D0=B5=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D0=BA=D0=BE=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=20=D0=B2?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=D0=BE=D0=B2-=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Вместо «Вариант 101/102/103» (технические номера) показываем источник: «РТ-2024/25 · этап I/II/III». examVariantLabel() в exam-prep.js — единый источник подписи: listVariants (пикер/dropdown) + variant_label в ответе mock/:id (строка прохождения и результата). Номера в БД остаются 101+ (нужны для фильтра-диапазона [101;1999] и провенанса). math9 — fallback «Вариант N» (не затронут). Новые варианты (104+) — дописывать в VARIANT_LABEL. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/src/routes/exam-prep.js | 15 ++++++++++++++- frontend/js/exam-prep/mock.js | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/backend/src/routes/exam-prep.js b/backend/src/routes/exam-prep.js index 1ee459e..079d7d7 100644 --- a/backend/src/routes/exam-prep.js +++ b/backend/src/routes/exam-prep.js @@ -30,6 +30,18 @@ const isMockVariant = (examKey, v) => { return r ? (v >= r[0] && v <= r[1]) : (v >= 1); }; +/* Человекочитаемая подпись варианта (номер в БД остаётся техническим, напр. 101). + Для ctmath варианты-пробники именуются по источнику; при добавлении новых + вариантов (104+) — дописывать сюда. Иначе fallback «Вариант N». */ +const VARIANT_LABEL = { + ctmath: { + 101: 'РТ-2024/25 · этап I', + 102: 'РТ-2024/25 · этап II', + 103: 'РТ-2024/25 · этап III', + }, +}; +const examVariantLabel = (examKey, v) => VARIANT_LABEL[examKey]?.[v] || `Вариант ${v}`; + /* ── Statements (prepared once) ────────────────────────────────── */ const SQL = { listTracks: db.prepare(` @@ -496,7 +508,7 @@ router.get('/:examKey/variants', (req, res) => { const rows = SQL.listVariants.all(req.user.id, examKey).filter(r => isMockVariant(examKey, r.variant)); const variants = rows.map(r => ({ n: r.variant, - label: `Вариант ${r.variant}`, + label: examVariantLabel(examKey, r.variant), total: r.total, solved: r.solved, viewed_sol: r.viewed_sol, @@ -1267,6 +1279,7 @@ router.get('/mock/:id', (req, res) => { id: sess.id, exam_key: sess.exam_key, variant: sess.variant, + variant_label: sess.variant != null ? examVariantLabel(sess.exam_key, sess.variant) : null, source: sess.source, status: sess.status, started_at: sess.started_at, diff --git a/frontend/js/exam-prep/mock.js b/frontend/js/exam-prep/mock.js index 0922480..9b563b3 100644 --- a/frontend/js/exam-prep/mock.js +++ b/frontend/js/exam-prep/mock.js @@ -149,7 +149,7 @@ const totalMs = session.duration_planned_min * 60 * 1000; const sourceLabel = session.source === 'variant' - ? `Вариант ${session.variant}` + ? (session.variant_label || `Вариант ${session.variant}`) : `Случайные ${tasks.length} задач`; main.innerHTML = `