refactor(KnowledgeItemEditor): 重构知识项编辑器组件结构

- 提取创建模式判断逻辑为独立变量 isCreateMode
- 使用条件渲染替代原有的 data?.id 判断
- 将表单字段按照创建和编辑模式进行分组重构
- 优化文件上传和替换功能的显示逻辑
- 改进代码可读性和维护性
This commit is contained in:
2026-01-29 14:37:05 +08:00
parent f77fd99c31
commit 0dba604cd3

View File

@@ -51,7 +51,8 @@ export default function KnowledgeItemEditor({
const isFileItem =
data?.contentType === KnowledgeContentType.FILE ||
data?.sourceType === KnowledgeSourceType.FILE_UPLOAD;
const contentTypeLabel = !data?.id
const isCreateMode = !data?.id;
const contentTypeLabel = isCreateMode
? "文件"
: data?.contentType === KnowledgeContentType.MARKDOWN
? "Markdown"
@@ -294,22 +295,7 @@ export default function KnowledgeItemEditor({
okButtonProps={{ disabled: readOnly }}
>
<Form form={form} layout="vertical" disabled={readOnly}>
<div className="grid grid-cols-2 gap-4">
<Form.Item
label="标题"
name="title"
rules={[{ required: !isMultiFile, message: "请输入标题" }]}
>
<Input
placeholder={isMultiFile ? "多文件将按文件名自动生成" : "请输入标题"}
disabled={readOnly || (!data?.id && isMultiFile)}
/>
</Form.Item>
<Form.Item label="状态" name="status">
<Select options={knowledgeStatusOptions} />
</Form.Item>
</div>
{!data?.id && (
{isCreateMode && (
<Form.Item label="上传文件" required>
<Upload
beforeUpload={handleFileBeforeUpload}
@@ -326,76 +312,95 @@ export default function KnowledgeItemEditor({
</div>
</Form.Item>
)}
{data?.id && isFileItem && (
<Form.Item label="文件">
<div className="flex items-center gap-2">
<span className="truncate" title={data.sourceFileId || data.title}>
{data.sourceFileId || data.title || "-"}
</span>
<Button size="small" onClick={handleDownloadFile} disabled={readOnly}>
</Button>
{!isCreateMode && (
<>
<div className="grid grid-cols-2 gap-4">
<Form.Item
label="标题"
name="title"
rules={[{ required: !isMultiFile, message: "请输入标题" }]}
>
<Input
placeholder={isMultiFile ? "多文件将按文件名自动生成" : "请输入标题"}
disabled={readOnly || (!data?.id && isMultiFile)}
/>
</Form.Item>
<Form.Item label="状态" name="status">
<Select options={knowledgeStatusOptions} />
</Form.Item>
</div>
</Form.Item>
)}
{data?.id && isFileItem && !readOnly && (
<Form.Item label="替换文件">
<Upload
beforeUpload={handleReplaceFileBeforeUpload}
fileList={replaceFileList}
onRemove={handleReplaceFileRemove}
showUploadList={{ showPreviewIcon: false }}
maxCount={1}
>
<Button icon={<UploadOutlined />}></Button>
</Upload>
<div className="text-xs text-gray-500 mt-1"></div>
</Form.Item>
)}
<div className="grid grid-cols-2 gap-4">
<Form.Item label="内容类型">
<Input value={contentTypeLabel} disabled />
</Form.Item>
<Form.Item label="敏感级别" name="sensitivity">
<Input placeholder="请输入敏感级别" />
</Form.Item>
</div>
<div className="grid grid-cols-2 gap-4">
<Form.Item label="领域" name="domain">
<Input placeholder="请输入领域" />
</Form.Item>
<Form.Item label="业务线" name="businessLine">
<Input placeholder="请输入业务线" />
</Form.Item>
</div>
<div className="grid grid-cols-2 gap-4">
<Form.Item label="负责人" name="owner">
<Input placeholder="请输入负责人" />
</Form.Item>
<Form.Item label="标签" name="tags">
<Select
mode="tags"
options={tagOptions}
placeholder="请选择或输入标签"
/>
</Form.Item>
</div>
<div className="grid grid-cols-2 gap-4">
<Form.Item label="有效期开始" name="validFrom">
<DatePicker className="w-full" />
</Form.Item>
<Form.Item label="有效期结束" name="validTo">
<DatePicker className="w-full" />
</Form.Item>
</div>
<Form.Item label="扩展元数据" name="metadata">
<Input.TextArea placeholder="请输入元数据(JSON)" rows={3} />
</Form.Item>
{data?.sourceType && (
<div className="grid grid-cols-2 gap-4 text-sm text-gray-500">
<div>{data.sourceType}</div>
<div>{data.sourceFileId || "-"}</div>
</div>
{data?.id && isFileItem && (
<Form.Item label="文件">
<div className="flex items-center gap-2">
<span className="truncate" title={data.sourceFileId || data.title}>
{data.sourceFileId || data.title || "-"}
</span>
<Button size="small" onClick={handleDownloadFile} disabled={readOnly}>
</Button>
</div>
</Form.Item>
)}
{data?.id && isFileItem && !readOnly && (
<Form.Item label="替换文件">
<Upload
beforeUpload={handleReplaceFileBeforeUpload}
fileList={replaceFileList}
onRemove={handleReplaceFileRemove}
showUploadList={{ showPreviewIcon: false }}
maxCount={1}
>
<Button icon={<UploadOutlined />}></Button>
</Upload>
<div className="text-xs text-gray-500 mt-1"></div>
</Form.Item>
)}
<div className="grid grid-cols-2 gap-4">
<Form.Item label="内容类型">
<Input value={contentTypeLabel} disabled />
</Form.Item>
<Form.Item label="敏感级别" name="sensitivity">
<Input placeholder="请输入敏感级别" />
</Form.Item>
</div>
<div className="grid grid-cols-2 gap-4">
<Form.Item label="领域" name="domain">
<Input placeholder="请输入领域" />
</Form.Item>
<Form.Item label="业务线" name="businessLine">
<Input placeholder="请输入业务线" />
</Form.Item>
</div>
<div className="grid grid-cols-2 gap-4">
<Form.Item label="负责人" name="owner">
<Input placeholder="请输入负责人" />
</Form.Item>
<Form.Item label="标签" name="tags">
<Select
mode="tags"
options={tagOptions}
placeholder="请选择或输入标签"
/>
</Form.Item>
</div>
<div className="grid grid-cols-2 gap-4">
<Form.Item label="有效期开始" name="validFrom">
<DatePicker className="w-full" />
</Form.Item>
<Form.Item label="有效期结束" name="validTo">
<DatePicker className="w-full" />
</Form.Item>
</div>
<Form.Item label="扩展元数据" name="metadata">
<Input.TextArea placeholder="请输入元数据(JSON)" rows={3} />
</Form.Item>
{data?.sourceType && (
<div className="grid grid-cols-2 gap-4 text-sm text-gray-500">
<div>{data.sourceType}</div>
<div>{data.sourceFileId || "-"}</div>
</div>
)}
</>
)}
</Form>
</Modal>