From 14ac03b55105e8e66133a33dfc8d8fe4445f52da Mon Sep 17 00:00:00 2001 From: hzhang Date: Sun, 31 May 2026 15:03:50 +0100 Subject: [PATCH] =?UTF-8?q?feat(knowledge-base):=20Knowledge=20Base=20UI?= =?UTF-8?q?=20=E2=80=94=20browse/edit,=20modal,=20project=20links?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Knowledge Bases list page + sidebar entry + "+ New" create modal - Detail page with a recursive structure tree: add/edit/delete topics, categories and facts inline, including name + description editing - Create/metadata-edit modal (title, description) - Project edit modal gains a link/remove knowledge base section - Types and routes for /knowledge-bases and /knowledge-bases/:id - Scoped .kb-* styles (contained panel, topic cards, hierarchy guides) Co-Authored-By: Claude Opus 4.8 (1M context) --- src/App.tsx | 4 + src/components/KnowledgeBaseFormModal.tsx | 104 ++++++++ src/components/KnowledgeBaseTree.tsx | 275 ++++++++++++++++++++++ src/components/ProjectFormModal.tsx | 78 +++++- src/components/Sidebar.tsx | 1 + src/index.css | 124 ++++++++++ src/pages/KnowledgeBaseDetailPage.tsx | 87 +++++++ src/pages/KnowledgeBasesPage.tsx | 51 ++++ src/types/index.ts | 45 ++++ 9 files changed, 768 insertions(+), 1 deletion(-) create mode 100644 src/components/KnowledgeBaseFormModal.tsx create mode 100644 src/components/KnowledgeBaseTree.tsx create mode 100644 src/pages/KnowledgeBaseDetailPage.tsx create mode 100644 src/pages/KnowledgeBasesPage.tsx diff --git a/src/App.tsx b/src/App.tsx index 964d63c..0a0322a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,6 +8,8 @@ import TasksPage from '@/pages/TasksPage' import TaskDetailPage from '@/pages/TaskDetailPage' import ProjectsPage from '@/pages/ProjectsPage' import ProjectDetailPage from '@/pages/ProjectDetailPage' +import KnowledgeBasesPage from '@/pages/KnowledgeBasesPage' +import KnowledgeBaseDetailPage from '@/pages/KnowledgeBaseDetailPage' import MilestonesPage from '@/pages/MilestonesPage' import MilestoneDetailPage from '@/pages/MilestoneDetailPage' import NotificationsPage from '@/pages/NotificationsPage' @@ -130,6 +132,8 @@ export default function App() { } /> } /> } /> + } /> + } /> } /> } /> } /> diff --git a/src/components/KnowledgeBaseFormModal.tsx b/src/components/KnowledgeBaseFormModal.tsx new file mode 100644 index 0000000..e15e7b7 --- /dev/null +++ b/src/components/KnowledgeBaseFormModal.tsx @@ -0,0 +1,104 @@ +import { useEffect, useState } from 'react' +import api from '@/services/api' +import type { KnowledgeBase } from '@/types' + +type Props = { + isOpen: boolean + onClose: () => void + onSaved?: (kb: KnowledgeBase) => void | Promise + knowledgeBase?: KnowledgeBase | null +} + +type FormState = { + title: string + description: string +} + +const emptyForm: FormState = { title: '', description: '' } + +export default function KnowledgeBaseFormModal({ isOpen, onClose, onSaved, knowledgeBase }: Props) { + const [saving, setSaving] = useState(false) + const [error, setError] = useState('') + const [form, setForm] = useState(emptyForm) + + useEffect(() => { + if (!isOpen) return + setError('') + if (knowledgeBase) { + setForm({ title: knowledgeBase.title, description: knowledgeBase.description || '' }) + } else { + setForm(emptyForm) + } + }, [isOpen, knowledgeBase]) + + const submit = async (e: React.FormEvent) => { + e.preventDefault() + setSaving(true) + setError('') + try { + if (knowledgeBase) { + const { data } = await api.patch(`/knowledge-bases/${knowledgeBase.id}`, { + title: form.title, + description: form.description || null, + }) + await onSaved?.(data) + } else { + const { data } = await api.post('/knowledge-bases', { + title: form.title, + description: form.description || null, + }) + await onSaved?.(data) + } + onClose() + } catch (err: any) { + setError(err?.response?.data?.detail || 'Failed to save knowledge base') + } finally { + setSaving(false) + } + } + + if (!isOpen) return null + + return ( +
+
e.stopPropagation()}> +
+

{knowledgeBase ? 'Edit Knowledge Base' : 'Create Knowledge Base'}

+ +
+ +
+ + +