feat(annotation): 添加模板受限编辑模式

- 引入 restrictedMode 属性控制表单编辑权限
- 在数据对象区域显示锁定状态提示
- 禁用受限制字段的输入功能
- 隐藏受限制时的删除和添加按钮
- 在标签控件区域显示可编辑状态提示
- 更新XML编辑器为只读模式并显示相应提示
- 添加模板选择状态跟踪功能
This commit is contained in:
2026-01-19 15:55:23 +08:00
parent e192c826eb
commit a778ac23b5
2 changed files with 106 additions and 47 deletions

View File

@@ -1,6 +1,6 @@
import { queryDatasetsUsingGet } from "@/pages/DataManagement/dataset.api";
import { mapDataset } from "@/pages/DataManagement/dataset.const";
import { Button, Form, Input, Modal, Select, message, Tabs, Radio, Typography } from "antd";
import { Button, Form, Input, Modal, Select, message, Tabs, Radio } from "antd";
import TextArea from "antd/es/input/TextArea";
import { useEffect, useState } from "react";
import {
@@ -33,6 +33,8 @@ export default function CreateAnnotationTask({
const [previewTaskData, setPreviewTaskData] = useState<Record<string, any>>({});
const [configMode, setConfigMode] = useState<"template" | "custom">("template");
const [templateEditTab, setTemplateEditTab] = useState<"visual" | "xml">("visual");
// 是否已选择模板(用于启用受限编辑模式)
const [hasSelectedTemplate, setHasSelectedTemplate] = useState(false);
useEffect(() => {
if (!open) return;
@@ -76,6 +78,7 @@ export default function CreateAnnotationTask({
setPreviewTaskData({});
setConfigMode("template");
setTemplateEditTab("visual");
setHasSelectedTemplate(false);
}
}, [open, manualForm]);
@@ -179,6 +182,15 @@ export default function CreateAnnotationTask({
// 当选择模板时,加载模板配置到表单
const handleTemplateSelect = (value: string, option: any) => {
// 处理清除选择的情况
if (!value) {
setHasSelectedTemplate(false);
setCustomXml("");
return;
}
setHasSelectedTemplate(true);
if (option && option.config) {
setCustomXml(option.config);
}
@@ -297,7 +309,7 @@ export default function CreateAnnotationTask({
<Form.Item
label="数据集"
name="datasetId"
rules={[{ required: true, message: "请选择数据集" }]}
rules={[{ required: true, message: "请选择数据集" }]}
>
<Select
placeholder="请选择数据集"
@@ -440,23 +452,29 @@ export default function CreateAnnotationTask({
setTemplateEditTab(key as "visual" | "xml");
}}
size="small"
items={[
items={[
{
key: "visual",
label: "可视化配置",
children: (
<div style={{ maxHeight: '350px', overflowY: 'auto' }}>
<TemplateConfigurationForm form={manualForm} />
<TemplateConfigurationForm
form={manualForm}
restrictedMode={hasSelectedTemplate}
/>
</div>
),
},
{
key: "xml",
label: "XML编辑器(高级)",
label: hasSelectedTemplate ? "XML配置(只读)" : "XML编辑器(高级)",
children: (
<div>
<div className="mb-2 text-xs text-gray-500">
Label Studio XML
{hasSelectedTemplate
? "基于模板创建时,XML 配置为只读。如需完全自定义,请切换'自定义配置'模式。"
: "直接编辑 Label Studio XML 配置。注意:在此修改后切换回可视化配置可能会丢失部分高级设置。"
}
</div>
<TextArea
rows={10}
@@ -464,6 +482,7 @@ export default function CreateAnnotationTask({
onChange={(e) => setCustomXml(e.target.value)}
placeholder="<View>...</View>"
style={{ fontFamily: 'monospace', fontSize: 12 }}
disabled={hasSelectedTemplate}
/>
</div>
),
@@ -486,7 +505,7 @@ export default function CreateAnnotationTask({
onCancel={() => setShowPreview(false)}
title="标注界面预览"
width={1000}
footer={[
footer={[
<Button key="close" onClick={() => setShowPreview(false)}>
</Button>
@@ -506,4 +525,4 @@ export default function CreateAnnotationTask({
</Modal>
</>
);
}
}