'use strict'; /* admin → games (game features + free-student features) section */ (function () { 'use strict'; let inited = false; const GAME_FEATURES = [ { key: 'gamification', label: 'Геймификация (всё)', desc: 'Мастер-выключатель: XP, уровни, достижения, монеты, стрики, магазин, лидерборд, испытания, рамки. Выкл → всё это скрыто и не начисляется у ВСЕХ', icon: 'trophy' }, { key: 'hangman', label: 'Виселица', desc: 'Игра «Угадай слово» — отгадывание терминов по буквам', icon: 'gamepad-2' }, { key: 'crossword', label: 'Кроссворд', desc: 'Кроссворд из терминов — генерируется автоматически по темам', icon: 'grid-3x3' }, { key: 'pet', label: 'Питомец', desc: 'Виртуальный питомец, отражающий активность ученика', icon: 'heart' }, { key: 'red_book', label: 'Красная книга', desc: 'Интерактивная Красная книга РБ: виды, биомы, пищевые сети, квесты', icon: 'leaf' }, { key: 'collection', label: 'Коллекция', desc: 'Коллекция карточек и достижений — игровой прогресс ученика', icon: 'layers' }, { key: 'flashcards', label: 'Флеш-карточки', desc: 'Карточки для запоминания терминов и понятий методом интервальных повторений', icon: 'square-stack' }, { key: 'imggen', label: 'Генерация картинок (ИИ)', desc: 'ИИ-генерация изображений в ассистенте, флэшкартах, уроках, питомце, аватаре, доске', icon: 'image' }, { key: 'knowledge_map', label: 'Карта знаний', desc: 'Визуальная карта тем и связей между биологическими понятиями', icon: 'share-2' }, { key: 'theory', label: 'Теория', desc: 'Раздел «Теория»: учебные курсы и уроки для учеников', icon: 'brain' }, { key: 'board', label: 'Доска', desc: 'Классная доска с объявлениями, постами и обсуждениями', icon: 'layout-dashboard'}, { key: 'biochem', label: 'Биохимия', desc: 'Молекулярный редактор, задачи на построение молекул и реакции', icon: 'flask-conical' }, { 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 = [ { key: 'gamification', label: 'Геймификация', desc: 'XP, уровни, достижения, монеты, стрики, магазин', icon: 'trophy' }, { key: 'hangman', label: 'Виселица', desc: 'Игра «Угадай слово» — отгадывание терминов по буквам', icon: 'gamepad-2' }, { key: 'crossword', label: 'Кроссворд', desc: 'Кроссворд из терминов — генерируется автоматически', icon: 'grid-3x3' }, { key: 'pet', label: 'Питомец', desc: 'Виртуальный питомец, отражающий активность ученика', icon: 'heart' }, { 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' }, { key: 'board', label: 'Доска', desc: 'Классная доска с объявлениями и постами', icon: 'layout-dashboard' }, { key: 'biochem', label: 'Биохимия', desc: 'Молекулярный редактор, задачи на построение молекул и реакции', icon: 'flask-conical' }, { key: 'live_quiz', label: 'Живая викторина', desc: 'Синхронная викторина в реальном времени для всего класса', icon: 'radio' }, ]; async function loadGamesAdmin() { const grid = document.getElementById('games-features-grid'); try { const features = await LS.api('/api/admin/features'); grid.innerHTML = ''; for (const f of GAME_FEATURES) { const enabled = features[f.key] !== false; const card = document.createElement('div'); card.className = 'perm-card' + (enabled ? ' enabled' : ''); card.innerHTML = `
${f.label}
${f.desc}
`; grid.appendChild(card); } if (window.lucide) lucide.createIcons(); } catch(e) { grid.innerHTML = '
Ошибка загрузки
'; } } async function toggleGameFeature(key, enabled, checkbox) { try { await LS.api('/api/admin/features', { method: 'PATCH', body: JSON.stringify({ [key]: enabled }), }); const card = checkbox.closest('.perm-card'); if (card) card.classList.toggle('enabled', enabled); LS.toast(enabled ? 'Функция включена' : 'Функция отключена', 'success'); } catch(e) { checkbox.checked = !enabled; LS.toast('Ошибка: ' + e.message, 'error'); } } async function loadFsFeatures() { const grid = document.getElementById('fs-features-grid'); try { const features = await LS.api('/api/admin/free-student-features'); grid.innerHTML = ''; for (const f of FS_FEATURES) { const enabled = features[f.key] !== false; const card = document.createElement('div'); card.className = 'perm-card' + (enabled ? ' enabled' : ''); card.innerHTML = `
${f.label}
${f.desc}
`; grid.appendChild(card); } if (window.lucide) lucide.createIcons(); } catch(e) { grid.innerHTML = '
Ошибка загрузки
'; } } async function toggleFsFeature(key, enabled, checkbox) { try { await LS.api('/api/admin/free-student-features', { method: 'PATCH', body: JSON.stringify({ [key]: enabled }), }); const card = checkbox.closest('.perm-card'); if (card) card.classList.toggle('enabled', enabled); LS.toast(enabled ? 'Модуль включён' : 'Модуль отключён', 'success'); } catch(e) { checkbox.checked = !enabled; LS.toast('Ошибка: ' + e.message, 'error'); } } async function load() { await loadGamesAdmin(); await loadFsFeatures(); } window.toggleGameFeature = toggleGameFeature; window.toggleFsFeature = toggleFsFeature; window.AdminSections = window.AdminSections || {}; window.AdminSections.games = { init: async () => { if (inited) return; inited = true; await load(); }, reload: load, }; })();