diff --git a/packages/frontend/src/components/LessonTree.tsx b/packages/frontend/src/components/LessonTree.tsx new file mode 100644 index 0000000..b465beb --- /dev/null +++ b/packages/frontend/src/components/LessonTree.tsx @@ -0,0 +1,57 @@ +import { useState } from 'react'; +import { Link } from 'react-router-dom'; +import type { LessonTreeNode } from '@flashcard/shared'; +import { lessonsApi } from '../api/lessons.js'; +import { useLessons } from '../stores/lessonsStore.js'; + +export function LessonTree({ nodes, depth = 0 }: { nodes: LessonTreeNode[]; depth?: number }) { + const refresh = useLessons((s) => s.refresh); + const [addingTo, setAddingTo] = useState(null); + const [name, setName] = useState(''); + + async function addChild(parentId: number | null) { + if (!name.trim()) return; + await lessonsApi.create({ name: name.trim(), parentId }); + setName(''); setAddingTo(null); + await refresh(); + } + + async function rename(id: number, current: string) { + const next = prompt('Nieuwe naam', current); + if (next && next.trim() && next !== current) { + await lessonsApi.update(id, { name: next.trim() }); + await refresh(); + } + } + + async function remove(id: number) { + if (!confirm('Verwijder les en alle onderliggende lessen en kaarten?')) return; + await lessonsApi.remove(id); + await refresh(); + } + + return ( + + ); +} diff --git a/packages/frontend/src/pages/Admin.tsx b/packages/frontend/src/pages/Admin.tsx new file mode 100644 index 0000000..c1af58f --- /dev/null +++ b/packages/frontend/src/pages/Admin.tsx @@ -0,0 +1,29 @@ +import { useEffect, useState } from 'react'; +import { lessonsApi } from '../api/lessons.js'; +import { useLessons } from '../stores/lessonsStore.js'; +import { LessonTree } from '../components/LessonTree.js'; + +export function AdminPage() { + const { tree, refresh, loading } = useLessons(); + const [newRoot, setNewRoot] = useState(''); + + useEffect(() => { refresh(); }, [refresh]); + + async function addRoot() { + if (!newRoot.trim()) return; + await lessonsApi.create({ name: newRoot.trim(), parentId: null }); + setNewRoot(''); + await refresh(); + } + + return ( +
+

Lessen beheer

+
+ setNewRoot(e.target.value)} /> + +
+ {loading ?

Laden...

: } +
+ ); +} diff --git a/packages/frontend/src/router.tsx b/packages/frontend/src/router.tsx index 25f290f..dfe339c 100644 --- a/packages/frontend/src/router.tsx +++ b/packages/frontend/src/router.tsx @@ -1,5 +1,6 @@ import { createBrowserRouter, Navigate } from 'react-router-dom'; import { Layout } from './components/Layout.js'; +import { AdminPage } from './pages/Admin.js'; export const router = createBrowserRouter([ { @@ -7,7 +8,7 @@ export const router = createBrowserRouter([ element: , children: [ { index: true, element:
Dashboard placeholder
}, - { path: 'admin', element:
Admin placeholder
}, + { path: 'admin', element: }, { path: '*', element: }, ], },