import React, { useState } from "react"; import { Card, Button, Space, Row, Col, Drawer, Typography, message, } from "antd"; import { PlusOutlined, EyeOutlined, CodeOutlined, AppstoreOutlined, } from "@ant-design/icons"; import { TagBrowser } from "./components"; const { Paragraph } = Typography; const PREVIEW_DRAWER_WIDTH = "80vw"; interface VisualTemplateBuilderProps { onSave?: (templateCode: string) => void; } /** * Visual Template Builder * Provides a drag-and-drop interface for building Label Studio templates */ const VisualTemplateBuilder: React.FC = ({ onSave, }) => { const [drawerVisible, setDrawerVisible] = useState(false); const [previewVisible, setPreviewVisible] = useState(false); const [selectedTags, setSelectedTags] = useState< Array<{ name: string; category: "object" | "control" }> >([]); const handleTagSelect = (tagName: string, category: "object" | "control") => { message.info(`选择了 ${category === "object" ? "对象" : "控件"}: ${tagName}`); setSelectedTags([...selectedTags, { name: tagName, category }]); setDrawerVisible(false); }; const handleSave = () => { // TODO: Generate template XML from selectedTags message.success("模板保存成功"); onSave?.(""); }; return (
} >
{selectedTags.length === 0 ? (
点击"浏览标签"开始构建您的标注模板
) : ( {selectedTags.map((tag, index) => (
{tag.category === "object" ? "对象" : "控件"}: {tag.name}
))}
)}
setDrawerVisible(false)} > setPreviewVisible(false)} >
                    
                        {`
  
  ${selectedTags
                                .map(
                                    (tag) =>
                                        `<${tag.name}${tag.category === "object" ? ' name="obj" value="$data"' : ' name="ctrl" toName="obj"'} />`
                                )
                                .join("\n  ")}
`}
                    
                
); }; export default VisualTemplateBuilder;