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:
@@ -30,6 +30,18 @@ const isMockVariant = (examKey, v) => {
|
|||||||
return r ? (v >= r[0] && v <= r[1]) : (v >= 1);
|
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) ────────────────────────────────── */
|
/* ── Statements (prepared once) ────────────────────────────────── */
|
||||||
const SQL = {
|
const SQL = {
|
||||||
listTracks: db.prepare(`
|
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 rows = SQL.listVariants.all(req.user.id, examKey).filter(r => isMockVariant(examKey, r.variant));
|
||||||
const variants = rows.map(r => ({
|
const variants = rows.map(r => ({
|
||||||
n: r.variant,
|
n: r.variant,
|
||||||
label: `Вариант ${r.variant}`,
|
label: examVariantLabel(examKey, r.variant),
|
||||||
total: r.total,
|
total: r.total,
|
||||||
solved: r.solved,
|
solved: r.solved,
|
||||||
viewed_sol: r.viewed_sol,
|
viewed_sol: r.viewed_sol,
|
||||||
@@ -1267,6 +1279,7 @@ router.get('/mock/:id', (req, res) => {
|
|||||||
id: sess.id,
|
id: sess.id,
|
||||||
exam_key: sess.exam_key,
|
exam_key: sess.exam_key,
|
||||||
variant: sess.variant,
|
variant: sess.variant,
|
||||||
|
variant_label: sess.variant != null ? examVariantLabel(sess.exam_key, sess.variant) : null,
|
||||||
source: sess.source,
|
source: sess.source,
|
||||||
status: sess.status,
|
status: sess.status,
|
||||||
started_at: sess.started_at,
|
started_at: sess.started_at,
|
||||||
|
|||||||
@@ -149,7 +149,7 @@
|
|||||||
const totalMs = session.duration_planned_min * 60 * 1000;
|
const totalMs = session.duration_planned_min * 60 * 1000;
|
||||||
|
|
||||||
const sourceLabel = session.source === 'variant'
|
const sourceLabel = session.source === 'variant'
|
||||||
? `Вариант ${session.variant}`
|
? (session.variant_label || `Вариант ${session.variant}`)
|
||||||
: `Случайные ${tasks.length} задач`;
|
: `Случайные ${tasks.length} задач`;
|
||||||
|
|
||||||
main.innerHTML = `
|
main.innerHTML = `
|
||||||
|
|||||||
Reference in New Issue
Block a user