From c5d440a7a94e28b822032427fc532dd965baac75 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Tue, 23 Jun 2026 10:53:43 +0300 Subject: [PATCH] =?UTF-8?q?fix(tests):=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=BE=20exam/practice=20+=20=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B5=20=D0=BF=D1=83=D1=81=D1=82=D1=8B=D1=85?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BC=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Рассогласование: админ-настройка допускала режимы topic/random, но POST /api/sessions принимает только exam/practice → клик по такому предмету падал с 400. Убрал topic/random из валидатора subjects.js и из админ-дропдауна (SC_MODES). Дашборд: старые значения topic/random коэрсятся в practice; предметы без вопросов в банке И без фикс-теста больше не показываются (раньше давали 404 «No questions found» при запуске). Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/src/routes/subjects.js | 4 +++- frontend/dashboard.html | 10 +++++++--- frontend/js/admin/sections/subjects.js | 3 ++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/backend/src/routes/subjects.js b/backend/src/routes/subjects.js index 1de9c20..d752c80 100644 --- a/backend/src/routes/subjects.js +++ b/backend/src/routes/subjects.js @@ -11,7 +11,9 @@ router.get('/', (_req, res) => { router.patch('/:slug', authMiddleware, requireRole('admin'), (req, res) => { const { default_mode, default_count, default_test_id } = req.body; - const valid_modes = ['exam', 'practice', 'topic', 'random']; + // Старт сессии (POST /api/sessions) поддерживает только exam/practice — раньше тут + // допускались topic/random, но клик по такому предмету на дашборде падал с 400. + const valid_modes = ['exam', 'practice']; if (default_mode && !valid_modes.includes(default_mode)) return res.status(400).json({ error: 'Invalid mode' }); diff --git a/frontend/dashboard.html b/frontend/dashboard.html index 60ba7e3..3da0e8e 100644 --- a/frontend/dashboard.html +++ b/frontend/dashboard.html @@ -2222,10 +2222,14 @@ async function loadSubjects() { const list = document.getElementById('subjects-list'); try { - const SUBJ_MODE_LABELS = { exam:'Экзамен', practice:'Пробный тест', topic:'По теме', random:'Случайный' }; - const subjects = await LS.getSubjects(); + const SUBJ_MODE_LABELS = { exam:'Экзамен', practice:'Пробный тест' }; + // Прячем предметы, по которым нечего запустить (нет вопросов в банке и нет фикс-теста). + const subjects = (await LS.getSubjects()) + .filter(s => (s.question_count || 0) > 0 || s.default_test_id); + if (!subjects.length) { list.innerHTML = '
Тесты пока недоступны
'; return; } list.innerHTML = subjects.map((s, si) => { - const mode = s.default_mode || 'exam'; + let mode = s.default_mode || 'exam'; + if (mode !== 'exam' && mode !== 'practice') mode = 'practice'; // старые topic/random → practice (старт сессии их не принимает) const count = s.default_count || 25; const testId = s.default_test_id || null; const modeLabel = SUBJ_MODE_LABELS[mode] || mode; diff --git a/frontend/js/admin/sections/subjects.js b/frontend/js/admin/sections/subjects.js index 406eb68..e35a965 100644 --- a/frontend/js/admin/sections/subjects.js +++ b/frontend/js/admin/sections/subjects.js @@ -4,7 +4,8 @@ 'use strict'; let inited = false; - const SC_MODES = { exam: 'Экзамен', practice: 'Пробный тест', topic: 'По теме', random: 'Случайный' }; + // Старт сессии поддерживает только exam/practice (topic/random убраны — давали 400 на дашборде). + const SC_MODES = { exam: 'Экзамен', practice: 'Пробный тест' }; const SC_ICONS = { bio:'dna', chem:'flask-conical', math:'calculator', phys:'zap' }; const SC_COLORS = { bio:'#9B5DE5', chem:'#06D6A0', math:'#06B6D4', phys:'#F59E0B' };