import { getChallenges, createChallenge, updateChallenge, deleteChallenge } from "../services/classroom.js"; import { checkInstructorPermission } from "../services/auth.js"; import { auth } from "../services/firebase.js"; export function renderAdminView() { return `

後台管理系統 Admin Panel

載入中...
`; } export function setupAdminEvents() { // Permission Check const user = auth.currentUser; if (!user) { alert("請先登入"); window.location.hash = ''; // Back to Landing return; } checkInstructorPermission(user).then(inst => { if (!inst || !inst.permissions?.includes('add_question')) { alert("您沒有權限管理題目"); window.location.hash = 'instructor'; return; } }); loadChallenges(); document.getElementById('back-instructor-btn').addEventListener('click', () => { const referer = localStorage.getItem('vibecoding_admin_referer'); if (referer === 'instructor') { window.location.hash = 'instructor'; } else { window.location.hash = ''; // Main landing } localStorage.removeItem('vibecoding_admin_referer'); }); document.getElementById('add-challenge-btn').addEventListener('click', () => { openModal(); }); document.getElementById('save-challenge-btn').addEventListener('click', async () => { const id = document.getElementById('edit-id').value; const data = { title: document.getElementById('edit-title').value, level: document.getElementById('edit-level').value, description: document.getElementById('edit-desc').value, link: document.getElementById('edit-link').value, order: parseInt(document.getElementById('edit-order').value) || 0 }; if (id) { await updateChallenge(id, data); } else { await createChallenge(data); } closeChallengeModal(); loadChallenges(); }); } async function loadChallenges() { const list = document.getElementById('challenges-list'); const challenges = await getChallenges(); const levels = ['beginner', 'intermediate', 'advanced']; const levelNames = { beginner: "初級 (Beginner)", intermediate: "中級 (Intermediate)", advanced: "高級 (Advanced)" }; // Group challenges const groups = { beginner: [], intermediate: [], advanced: [] }; challenges.forEach(c => { if (groups[c.level]) groups[c.level].push(c); else groups.beginner.push(c); // Fallback }); list.innerHTML = levels.map(level => { const groupItems = groups[level] || []; const isOpen = level === 'beginner' ? 'open' : ''; // Open first by default const itemsHtml = groupItems.map(c => `
#${c.order}
${c.title}

${c.description}

`).join(''); return `

${levelNames[level]}

${groupItems.length} 題
${itemsHtml || '
尚無題目,請新增
'}
`; }).join(''); // Expose helpers globally for onclick window.editChallenge = (id) => { const c = challenges.find(x => x.id === id); if (c) openModal(c); }; window.deleteChallenge = async (id) => { if (confirm('確定刪除?')) { await deleteChallenge(id); loadChallenges(); } }; } // Global expose for the "Add to Section" button window.openModal = function (challenge = null, defaultLevel = 'beginner') { const modal = document.getElementById('challenge-modal'); const title = document.getElementById('modal-title'); // Reset or Fill document.getElementById('edit-id').value = challenge ? challenge.id : ''; document.getElementById('edit-title').value = challenge ? challenge.title : ''; // Use challenge level if editing, otherwise use defaultLevel passed from section button document.getElementById('edit-level').value = challenge ? challenge.level : defaultLevel; document.getElementById('edit-desc').value = challenge ? challenge.description : ''; document.getElementById('edit-link').value = challenge ? challenge.link : ''; document.getElementById('edit-order').value = challenge ? challenge.order : '1'; title.textContent = challenge ? '編輯題目' : '新增題目'; modal.classList.remove('hidden'); } window.closeChallengeModal = () => { document.getElementById('challenge-modal').classList.add('hidden'); };