fix(ctmath): чистка банка — год-пачки убраны из пикера пробников

- exam-prep.js: MOCK_VARIANT_RANGE — для ctmath показываем как пробники
  только чистые 30-задачные варианты [101;1999]; год-пачки (variant=год
  2011-2024 и 0, до 114 задач) остаются пулом для тренажёра по темам,
  но скрыты из пикера/mock-start/просмотра вариантов. math9 (1..80) не затронут
  (диапазон только для ctmath).
- mock.js: пикер «По варианту» — выпадающий список реальных вариантов
  (через listVariants) вместо number-input 1..N; раньше для ctmath он
  предлагал 1..18 и не доходил до 101 → пробник по варианту не запускался.
- cleanup_ctmath_bank.js: идемпотентный скрипт — ретайр битого id=1419
  (mc с противоречивым ответом → long), variants_count → 3 (чистых вариантов).
- seed_*: variants_count считается по диапазону [101;1999] (консистентно с роутом).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-18 22:22:32 +03:00
parent 6cd0a81d88
commit 68817cc612
6 changed files with 121 additions and 12 deletions
+11 -6
View File
@@ -44,11 +44,16 @@
/* ════════════════════════════════════════════════════════════
PHASE 1: SETUP
════════════════════════════════════════════════════════════ */
function renderSetup() {
async function renderSetup() {
const title = EP.info?.track?.title || 'Пробный экзамен';
const dur = EP.info?.track?.duration_min || 180;
const tpv = EP.info?.track?.tasks_per_variant || 10;
const vc = EP.info?.track?.variants_count || 80;
// Реальный список вариантов-пробников (бэкенд уже отфильтровал год-пачки):
// номера вариантов могут быть не подряд (ctmath: 101, 102, …), поэтому
// показываем выпадающий список реальных вариантов, а не диапазон 1..N.
let vlist = [];
try { vlist = (await EP.api.listVariants(examKey)).variants || []; } catch {}
const vOpts = vlist.map(v => `<option value="${v.n}">${v.label}</option>`).join('');
main.innerHTML = `
<div class="ep-card mk-setup">
@@ -65,10 +70,10 @@
<span>По варианту</span>
</div>
<div class="mk-source-body">
<label>Номер варианта:
<input type="number" min="1" max="${vc}" value="1" id="mk-variant-input" class="mk-input" />
<label>Вариант:
<select id="mk-variant-input" class="mk-input">${vOpts || '<option value="">—</option>'}</select>
</label>
<div class="mk-source-hint">Один из ${vc} реальных вариантов целиком.</div>
<div class="mk-source-hint">Один из ${vlist.length} готовых вариантов целиком.</div>
</div>
</div>
@@ -116,7 +121,7 @@
if (!Number.isInteger(v) || v < 1) {
btn.disabled = false; btn.innerHTML = '<i data-lucide="play"></i> Начать пробник';
if (window.lucide) lucide.createIcons();
return alert('Введите номер варианта');
return alert('Выберите вариант');
}
body.variant = v;
} else {