From ba0c69086ae003a7fc60a2f80a80839f106c8c1a Mon Sep 17 00:00:00 2001 From: Jason Wang <56037774+JasonW404@users.noreply.github.com> Date: Fri, 31 Oct 2025 15:56:29 +0800 Subject: [PATCH] feat: data annotation page adaptation to backend API. Improve labeling project creation module. * feat: data annotation page adaptation to the backend API. * feat: Implement labeling configuration editor and enhance annotation task creation form --- .../components/CreateAnnptationTaskDialog.tsx | 196 +++++++++++---- .../components/LabelingConfigEditor.tsx | 187 ++++++++++++++ .../DataAnnotation/Home/DataAnnotation.tsx | 238 ++++++++++++++++-- .../pages/DataAnnotation/annotation.api.ts | 31 ++- .../pages/DataAnnotation/annotation.const.tsx | 39 ++- .../pages/DataAnnotation/annotation.model.ts | 12 +- .../Report/EvaluationReport.tsx | 16 +- .../pages/Orchestration/WorkflowEditor.tsx | 26 +- .../Orchestration/components/CustomNode.tsx | 7 +- .../annotation/client/labelstudio/client.py | 6 +- .../module/annotation/interface/__init__.py | 2 + .../app/module/annotation/interface/about.py | 35 +++ .../module/annotation/interface/project.py | 58 +++-- .../app/module/annotation/schema/__init__.py | 5 +- .../{system => annotation}/schema/config.py | 5 +- .../app/module/annotation/schema/mapping.py | 27 +- .../app/module/annotation/service/mapping.py | 12 +- .../app/module/annotation/service/sync.py | 10 +- .../app/module/system/interface/about.py | 16 +- .../app/module/system/schema/__init__.py | 3 +- 20 files changed, 737 insertions(+), 194 deletions(-) create mode 100644 frontend/src/pages/DataAnnotation/Create/components/LabelingConfigEditor.tsx create mode 100644 runtime/datamate-python/app/module/annotation/interface/about.py rename runtime/datamate-python/app/module/{system => annotation}/schema/config.py (59%) diff --git a/frontend/src/pages/DataAnnotation/Create/components/CreateAnnptationTaskDialog.tsx b/frontend/src/pages/DataAnnotation/Create/components/CreateAnnptationTaskDialog.tsx index 329f32a..292f393 100644 --- a/frontend/src/pages/DataAnnotation/Create/components/CreateAnnptationTaskDialog.tsx +++ b/frontend/src/pages/DataAnnotation/Create/components/CreateAnnptationTaskDialog.tsx @@ -1,14 +1,12 @@ import { queryDatasetsUsingGet } from "@/pages/DataManagement/dataset.api"; -import { - datasetTypeMap, - mapDataset, -} from "@/pages/DataManagement/dataset.const"; -import { Button, Form, Input, Modal, Select } from "antd"; +import { mapDataset } from "@/pages/DataManagement/dataset.const"; +import { Button, Form, Input, Modal, Select, message } from "antd"; import TextArea from "antd/es/input/TextArea"; -import { Database } from "lucide-react"; import { useEffect, useState } from "react"; import { createAnnotationTaskUsingPost } from "../../annotation.api"; import { Dataset } from "@/pages/DataManagement/dataset.model"; +import LabelingConfigEditor from "./LabelingConfigEditor"; +import { useRef } from "react"; export default function CreateAnnotationTask({ open, @@ -21,6 +19,10 @@ export default function CreateAnnotationTask({ }) { const [form] = Form.useForm(); const [datasets, setDatasets] = useState([]); + const [submitting, setSubmitting] = useState(false); + const [nameManuallyEdited, setNameManuallyEdited] = useState(false); + const editorRef = useRef(null); + const EDITOR_LIST_HEIGHT = 420; useEffect(() => { if (!open) return; @@ -34,11 +36,36 @@ export default function CreateAnnotationTask({ fetchDatasets(); }, [open]); + // Reset form and manual-edit flag when modal opens + useEffect(() => { + if (open) { + form.resetFields(); + setNameManuallyEdited(false); + } + }, [open, form]); + const handleSubmit = async () => { - const values = await form.validateFields(); - await createAnnotationTaskUsingPost(values); - onClose(); - onRefresh(); + try { + const values = await form.validateFields(); + setSubmitting(true); + await createAnnotationTaskUsingPost(values); + message?.success?.("创建标注任务成功"); + onClose(); + onRefresh(); + } catch (err: any) { + console.error("Create annotation task failed", err); + const msg = err?.message || err?.data?.message || "创建失败,请稍后重试"; + // show a user friendly message + (message as any)?.error?.(msg); + } finally { + setSubmitting(false); + } + }; + + // Placeholder function: generates labeling interface from config + // For now it simply returns the parsed config (per requirement) + const generateLabelingInterface = (config: any) => { + return config; }; return ( @@ -48,51 +75,124 @@ export default function CreateAnnotationTask({ title="创建标注任务" footer={ <> - - + } + width={1200} > -
- - - - -