diff --git a/backend/src/controllers/adminController.js b/backend/src/controllers/adminController.js index c4db1f0..9d4fa68 100644 --- a/backend/src/controllers/adminController.js +++ b/backend/src/controllers/adminController.js @@ -525,7 +525,7 @@ function getFeatures(_req, res) { function updateFeatures(req, res) { const allowed = ['crossword', 'hangman', 'pet', 'red_book', 'collection', 'flashcards', 'knowledge_map', 'board', 'biochem', 'live_quiz', 'classroom', - 'gamification', 'assistant', 'sim_builder']; + 'gamification', 'assistant', 'sim_builder', 'quantik']; const updates = req.body; const stmt = db.prepare("INSERT OR REPLACE INTO app_settings (key, value) VALUES (?, ?)"); const getOld = db.prepare("SELECT value FROM app_settings WHERE key = ?"); diff --git a/frontend/js/admin/sections/games.js b/frontend/js/admin/sections/games.js index 1e25a16..c5ec61f 100644 --- a/frontend/js/admin/sections/games.js +++ b/frontend/js/admin/sections/games.js @@ -18,6 +18,7 @@ { key: 'live_quiz', label: 'Живая викторина', desc: 'Синхронная викторина в реальном времени для всего класса', icon: 'radio' }, { key: 'classroom', label: 'Онлайн-уроки (classroom)', desc: 'Синхронные онлайн-уроки с доской и видео', icon: 'video' }, { key: 'sim_builder', label: 'Конструктор симуляций', desc: 'Создание учителем своих интерактивных симуляций (рабочее поле, формулы, физика, графики)', icon: 'pencil-ruler' }, + { key: 'quantik', label: 'Квантик: Законы Мира', desc: '2D физика-головоломка: уровни на движке симуляций, прогресс, скины', icon: 'rocket' }, ]; const FS_FEATURES = [ @@ -28,6 +29,7 @@ { key: 'red_book', label: 'Красная книга', desc: 'Интерактивная Красная книга РБ: виды, биомы, квесты', icon: 'leaf' }, { key: 'collection', label: 'Коллекция', desc: 'Коллекция карточек и игровой прогресс ученика', icon: 'layers' }, { key: 'lab', label: 'Лаборатория', desc: 'Виртуальные симуляции и интерактивные опыты', icon: 'flask-conical' }, + { key: 'quantik', label: 'Квантик: Законы Мира', desc: '2D физика-головоломка на движке симуляций', icon: 'rocket' }, { key: 'knowledge_map',label: 'Карта знаний', desc: 'Визуальная карта тем и связей между понятиями', icon: 'map' }, { key: 'flashcards', label: 'Флеш-карточки', desc: 'Карточки для повторения терминов и понятий', icon: 'square-stack' }, { key: 'imggen', label: 'Генерация картинок (ИИ)', desc: 'ИИ-генерация изображений в ассистенте, флэшкартах, уроках, питомце', icon: 'image' }, diff --git a/js/api.js b/js/api.js index dcd4534..1139ac0 100644 --- a/js/api.js +++ b/js/api.js @@ -863,6 +863,7 @@ async function hideDisabledFeatures() { sim_builder: ['/sim-builder', '/sim-builder.html'], exam9: ['/exam9', '/exam9.html'], textbooks: ['/textbooks', '/textbooks.html', '/textbook'], + quantik: ['/quantik', '/quantik.html'], }; for (const [key, hrefs] of Object.entries(map)) { if (feats[key] === false) { @@ -908,7 +909,7 @@ async function hideDisabledFeatures() { '/board', '/lab', '/hangman', '/crossword', '/pet', '/collection', '/collection.html', '/knowledge-map', '/red-book', '/red-book.html', '/red-book-ecosystem.html', '/red-book-biomes.html', - '/flashcards', '/live-quiz', + '/flashcards', '/live-quiz', '/quantik', ]; classOnlyHrefs.forEach(href => { document.querySelectorAll(`[href="${href}"]`).forEach(el => el.style.display = 'none'); @@ -919,7 +920,7 @@ async function hideDisabledFeatures() { '/board', '/lab', '/hangman', '/crossword', '/pet', '/collection', '/collection-rb', '/knowledge-map', '/red-book', '/red-book-ecosystem', '/red-book-biomes', '/red-book-games', - '/flashcards', '/live-quiz', + '/flashcards', '/live-quiz', '/quantik', ]; if (classOnlyPaths.some(h => cur === h || cur === h + '.html')) { window.location.href = '/dashboard';