import { useState, useEffect } from 'react'; import { Database, FileText, Settings, Users, Network, Clock, CheckCircle2, AlertCircle, Save, Info, Layers, CheckSquare, CalendarDays, Activity } from 'lucide-react'; import Card from '../../components/ui/Card'; import Tag from '../../components/ui/Tag'; import Button from '../../components/ui/Button'; import Input from '../../components/ui/Input'; import { storage } from '../../lib/storage'; import * as db from '../../lib/db'; import UploadZone from '../../components/admin/UploadZone'; import KnowledgeGraph from '../../components/admin/KnowledgeGraph'; import ContentManager from '../../components/admin/ContentManager'; import TestManager from '../../components/admin/TestManager'; import TeamManager from '../../components/admin/TeamManager'; import CurriculumManager from '../../components/admin/CurriculumManager'; import Diagnostics from '../../components/admin/Diagnostics'; import { Trash2 } from 'lucide-react'; const TIER_PLACEHOLDERS = { fast: 'claude-haiku-4-5-20251001', standard: 'claude-sonnet-4-6', reasoning: 'claude-opus-4-7', }; const Admin = () => { const [activeTab, setActiveTab] = useState('sources'); const [sources, setSources] = useState([]); const [modelFast, setModelFast] = useState(''); const [modelStandard, setModelStandard] = useState(''); const [modelReasoning, setModelReasoning] = useState(''); const [useSimulation, setUseSimulation] = useState(false); const [saveStatus, setSaveStatus] = useState(null); const loadSources = async () => { const data = await db.getSources(); setSources(data); }; useEffect(() => { if (activeTab === 'sources') { loadSources(); } if (activeTab === 'settings') { const legacyStandard = storage.get('admin:model', ''); setModelFast(storage.get('admin:model:fast', '') || ''); setModelStandard(storage.get('admin:model:standard', '') || legacyStandard || ''); setModelReasoning(storage.get('admin:model:reasoning', '') || ''); setUseSimulation(storage.get('admin:use_simulation', false)); } }, [activeTab]); const saveSettings = async (e) => { e.preventDefault(); storage.set('admin:model:fast', modelFast.trim()); storage.set('admin:model:standard', modelStandard.trim()); storage.set('admin:model:reasoning', modelReasoning.trim()); storage.set('admin:use_simulation', useSimulation); setSaveStatus('Saved!'); setTimeout(() => setSaveStatus(null), 3000); }; const handleDeleteSource = async (id) => { if (confirm('Are you sure you want to delete this source? This will not delete topics already extracted.')) { await db.deleteSource(id); await loadSources(); } }; const navItems = [ { key: 'sources', icon: Database, label: 'Sources' }, { key: 'content', icon: Layers, label: 'Content' }, { key: 'tests', icon: CheckSquare, label: 'Quizzes' }, { key: 'curriculum', icon: CalendarDays, label: 'Curriculum' }, { key: 'graph', icon: Network, label: 'Graph' }, { key: 'team', icon: Users, label: 'Team' }, { key: 'diagnostics', icon: Activity, label: 'Diagnostics' }, { key: 'settings', icon: Settings, label: 'Settings', bottom: true }, ]; return (
Upload files to feed the AI knowledge extraction pipeline.
{source.name}
Manage, refine, or regenerate AI-generated learning modules for each knowledge topic.
Pre-generate and review quiz questions for each topic to eliminate loading times for users.
Plan and manage the 52-week learning schedule. All employees follow the same weekly topic.
Visual map of all extracted Respellion knowledge.
Manage team members, roles, and login PINs.
LLM-aanroepen, tokenverbruik en geschatte kosten.
Manage API keys and application configuration.