feat(ctmath): человекочитаемые подписи вариантов-пробников

Вместо «Вариант 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) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-19 08:31:45 +03:00
parent 68817cc612
commit 9a13a19e63
2 changed files with 15 additions and 2 deletions
+14 -1
View File
@@ -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,