Skip to content

Commit 4aeb9c4

Browse files
authored
feat: enhance knowledge base chunk management and unify delete confirmation dialogs (#435)
* fix: add validation rules for knowledge base name input * fix: adjust pagination settings and clean up unused components in KnowledgeBaseFileDetail * fix: improve pagination controls and enhance chunk display in KnowledgeBaseFileDetail * fix: enhance chunk display messages in KnowledgeBaseFileDetail * fix: replace metadata display with syntax highlighter in KnowledgeBaseFileDetail * fix: add chunk update and delete functionality with user feedback in KnowledgeBaseFileDetail * fix: enhance user feedback and validation messages in KnowledgeBaseFileDetail * fix: update breadcrumb and default file name in KnowledgeBaseFileDetail * fix: update breadcrumb and default file name in KnowledgeBaseFileDetail * fix: enhance metadata validation and add action buttons in KnowledgeBaseFileDetail * fix: enhance chunk deletion process and return rag_file_id in delete_chunk_by_id * fix: implement batched chunk deletion by rag_file_id in store.py * fix: add confirmation modal for file deletion in KnowledgeBase components * fix: replace Popconfirm with Modal for confirmation in DetailHeader actions * fix: enhance delete confirmation message in DatasetDetail with item name
1 parent 1875918 commit 4aeb9c4

File tree

16 files changed

+833
-170
lines changed

16 files changed

+833
-170
lines changed

frontend/src/components/DeleteConfirmModal.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export default function DeleteConfirmModal({
5757
okType="danger"
5858
okText={t("components.deleteConfirm.confirm")}
5959
cancelText={t("components.deleteConfirm.cancel")}
60+
centered
6061
>
6162
<p>{defaultMessage}</p>
6263
</Modal>

frontend/src/components/DetailHeader.tsx

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useLayoutEffect, useEffect, useRef, useState, useCallback, useMemo } from "react";
22
import { Database } from "lucide-react";
3-
import { Card, Button, Tag, Tooltip, Popconfirm, Popover } from "antd";
3+
import { Card, Button, Tag, Tooltip, Modal } from "antd";
44
import type { ItemType } from "antd/es/menu/interface";
55
import AddTagPopover from "./AddTagPopover";
66
import ActionDropdown from "./ActionDropdown";
@@ -291,23 +291,30 @@ function DetailHeader<T>({
291291
);
292292
}
293293
if (op.confirm) {
294+
const showConfirmModal = () => {
295+
Modal.confirm({
296+
title: op.confirm?.title,
297+
content: op.confirm?.description,
298+
okText: op.confirm?.okText,
299+
okType: op.danger ? "danger" : "primary",
300+
cancelText: op.confirm?.cancelText,
301+
centered: true,
302+
onOk: () => {
303+
if (op.onClick) {
304+
op.onClick();
305+
} else {
306+
op?.confirm?.onConfirm?.();
307+
}
308+
},
309+
});
310+
};
294311
return (
295312
<Tooltip key={op.key} title={op.label}>
296-
<Popconfirm
297-
key={op.key}
298-
{...op.confirm}
299-
onConfirm={() => {
300-
if (op.onClick) {
301-
op.onClick()
302-
} else {
303-
op?.confirm?.onConfirm?.();
304-
}
305-
}}
306-
okType={op.danger ? "danger" : "primary"}
307-
overlayStyle={{ zIndex: 9999 }}
308-
>
309-
<Button icon={op.icon} danger={op.danger} />
310-
</Popconfirm>
313+
<Button
314+
icon={op.icon}
315+
danger={op.danger}
316+
onClick={showConfirmModal}
317+
/>
311318
</Tooltip>
312319
);
313320
}

frontend/src/i18n/locales/en/common.json

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,8 @@
16551655
"confirm": {
16561656
"deleteTitle": "Confirm deletion of this knowledge base?",
16571657
"deleteDescription": "It cannot be recovered after deletion. Please operate with caution.",
1658+
"deleteFileTitle": "Confirm deletion of this file?",
1659+
"deleteFileDescription": "Are you sure you want to delete \"{{name}}\"? This action cannot be undone.",
16581660
"okText": "Delete",
16591661
"cancelText": "Cancel"
16601662
},
@@ -1684,7 +1686,8 @@
16841686
"noProperties": "No properties"
16851687
},
16861688
"breadcrumb": {
1687-
"kbList": "Knowledge Bases"
1689+
"kbList": "Knowledge Bases",
1690+
"kbDetail": "Knowledge Base Detail"
16881691
},
16891692
"searchPlaceholder": "Search file name..."
16901693
},
@@ -1698,16 +1701,38 @@
16981701
"actions": {
16991702
"download": "Download",
17001703
"save": "Save",
1701-
"cancel": "Cancel"
1704+
"cancel": "Cancel",
1705+
"confirm": "Confirm",
1706+
"formatJson": "Format",
1707+
"view": "View",
1708+
"edit": "Edit",
1709+
"delete": "Delete"
17021710
},
17031711
"messages": {
17041712
"noChunks": "No chunk data",
17051713
"chunkCount": "chunks",
1714+
"totalChunks": "Total {{count}} chunks",
1715+
"showingRange": "showing {{start}}-{{end}}",
17061716
"ready": "Ready",
17071717
"previousPage": "Previous Page",
17081718
"nextPage": "Next Page",
17091719
"chunkLabel": "Chunk",
1710-
"loadFailed": "Load failed"
1720+
"loadFailed": "Load failed",
1721+
"updateSuccess": "Chunk updated successfully",
1722+
"updateFailed": "Failed to update chunk",
1723+
"deleteSuccess": "Chunk deleted successfully",
1724+
"deleteFailed": "Failed to delete chunk",
1725+
"invalidMetadata": "Invalid metadata JSON format",
1726+
"invalidMetadataFormat": "Metadata is not valid JSON format",
1727+
"textRequired": "Chunk content cannot be empty",
1728+
"formatSuccess": "JSON formatted successfully",
1729+
"metadataHint": "Please enter valid JSON format. Click 'Format' button to auto-format.",
1730+
"jsonValid": "Valid JSON",
1731+
"jsonInvalid": "Invalid JSON"
1732+
},
1733+
"placeholders": {
1734+
"chunkContent": "Enter chunk content",
1735+
"metadata": "Enter metadata (JSON format)"
17111736
},
17121737
"modal": {
17131738
"sliceTraceTitle": "Knowledge Slice Trace",
@@ -1722,12 +1747,16 @@
17221747
"position": "Position",
17231748
"tokenCount": "Token Count",
17241749
"pageNumber": "Page Number",
1725-
"chapter": "Chapter"
1750+
"chapter": "Chapter",
1751+
"deleteConfirmTitle": "Confirm Delete Chunk",
1752+
"deleteConfirmMessage": "Are you sure you want to delete this chunk? This will also delete the vector data in Milvus and cannot be undone.",
1753+
"editChunkTitle": "Edit Chunk"
17261754
},
17271755
"breadcrumb": {
17281756
"kbList": "Knowledge Bases",
17291757
"kbDetail": "Knowledge Base Detail"
1730-
}
1758+
},
1759+
"defaultFileName": "File {{id}}"
17311760
},
17321761
"create": {
17331762
"title": "Create Knowledge Base",
@@ -1740,6 +1769,8 @@
17401769
"nameLabel": "Knowledge Base Name",
17411770
"namePlaceholder": "Please enter knowledge base name",
17421771
"nameRequired": "Please enter knowledge base name",
1772+
"nameMaxLength": "Knowledge base name cannot exceed 255 characters",
1773+
"namePattern": "Knowledge base name must start with a letter and can only contain letters, numbers, and underscores",
17431774
"descriptionLabel": "Description",
17441775
"descriptionPlaceholder": "Please enter knowledge base description (optional)",
17451776
"embeddingModelLabel": "Embedding Model",

frontend/src/i18n/locales/zh/common.json

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,8 @@
16551655
"confirm": {
16561656
"deleteTitle": "确认删除该知识库吗?",
16571657
"deleteDescription": "删除后将无法恢复,请谨慎操作。",
1658+
"deleteFileTitle": "确认删除该文件吗?",
1659+
"deleteFileDescription": "确定要删除文件「{{name}}」吗?删除后将无法恢复。",
16581660
"okText": "删除",
16591661
"cancelText": "取消"
16601662
},
@@ -1698,16 +1700,38 @@
16981700
"actions": {
16991701
"download": "下载",
17001702
"save": "保存",
1701-
"cancel": "取消"
1703+
"cancel": "取消",
1704+
"confirm": "确认",
1705+
"formatJson": "格式化",
1706+
"view": "查看",
1707+
"edit": "编辑",
1708+
"delete": "删除"
17021709
},
17031710
"messages": {
17041711
"noChunks": "暂无分块数据",
17051712
"chunkCount": "个分块",
1713+
"totalChunks": "共 {{count}} 个分块",
1714+
"showingRange": "当前显示第 {{start}}-{{end}} 个",
17061715
"ready": "就绪",
17071716
"previousPage": "上一页",
17081717
"nextPage": "下一页",
17091718
"chunkLabel": "分块",
1710-
"loadFailed": "加载失败"
1719+
"loadFailed": "加载失败",
1720+
"updateSuccess": "分块更新成功",
1721+
"updateFailed": "分块更新失败",
1722+
"deleteSuccess": "分块删除成功",
1723+
"deleteFailed": "分块删除失败",
1724+
"invalidMetadata": "元数据JSON格式无效",
1725+
"invalidMetadataFormat": "元数据不是有效的JSON格式",
1726+
"textRequired": "分块内容不能为空",
1727+
"formatSuccess": "JSON格式化成功",
1728+
"metadataHint": "请输入有效的JSON格式数据,点击\"格式化\"按钮可自动整理格式",
1729+
"jsonValid": "JSON格式正确",
1730+
"jsonInvalid": "JSON格式错误"
1731+
},
1732+
"placeholders": {
1733+
"chunkContent": "请输入分块内容",
1734+
"metadata": "请输入元数据(JSON格式)"
17111735
},
17121736
"modal": {
17131737
"sliceTraceTitle": "知识切片回溯",
@@ -1722,12 +1746,16 @@
17221746
"position": "位置",
17231747
"tokenCount": "Token数量",
17241748
"pageNumber": "页码",
1725-
"chapter": "章节"
1749+
"chapter": "章节",
1750+
"deleteConfirmTitle": "确认删除分块",
1751+
"deleteConfirmMessage": "确定要删除这个分块吗?此操作将同时删除Milvus中的向量数据,且无法恢复。",
1752+
"editChunkTitle": "编辑分块"
17261753
},
17271754
"breadcrumb": {
17281755
"kbList": "知识库",
17291756
"kbDetail": "知识库详情"
1730-
}
1757+
},
1758+
"defaultFileName": "文件 {{id}}"
17311759
},
17321760
"create": {
17331761
"title": "创建知识库",
@@ -1740,6 +1768,8 @@
17401768
"nameLabel": "知识库名称",
17411769
"namePlaceholder": "请输入知识库名称",
17421770
"nameRequired": "请输入知识库名称",
1771+
"nameMaxLength": "知识库名称长度不能超过255个字符",
1772+
"namePattern": "知识库名称必须以字母开头,只能包含字母、数字和下划线",
17431773
"descriptionLabel": "描述",
17441774
"descriptionPlaceholder": "请输入知识库描述(可选)",
17451775
"embeddingModelLabel": "索引模型",

frontend/src/pages/DataManagement/Detail/DatasetDetail.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ export default function DatasetDetail() {
343343
okText={t("dataManagement.confirm.deleteConfirm")}
344344
cancelText={t("dataManagement.confirm.deleteCancel")}
345345
okButtonProps={{ danger: true }}
346+
centered
346347
>
347348
<p>{t("dataManagement.confirm.deleteDatasetDesc", { itemName: dataset.name || t("dataManagement.detail.title") })}</p>
348349
</Modal>

frontend/src/pages/KnowledgeBase/Detail/KnowledgeBaseDetail.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type React from "react";
22
import { useEffect, useState } from "react";
3-
import { Table, Badge, Button, Breadcrumb, Tooltip, App, Card, Input, Empty, Spin, Tag } from "antd";
3+
import { Table, Badge, Button, Breadcrumb, Tooltip, App, Card, Input, Empty, Spin, Tag, Modal } from "antd";
4+
import { ExclamationCircleOutlined } from "@ant-design/icons";
45
import ReactMarkdown from "react-markdown";
56
import remarkGfm from "remark-gfm";
67
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
@@ -154,6 +155,7 @@ const KnowledgeBaseDetailPage: React.FC = () => {
154155
});
155156
message.success(t("knowledgeBase.detail.messages.fileDeleted"));
156157
fetchFiles();
158+
fetchKnowledgeBaseDetails(knowledgeBase!.id);
157159
} catch {
158160
message.error(t("knowledgeBase.detail.messages.fileDeleteFailed"));
159161
}
@@ -263,7 +265,17 @@ const KnowledgeBaseDetailPage: React.FC = () => {
263265
label: t("knowledgeBase.detail.actions.deleteFile"),
264266
icon: <DeleteOutlined className="w-4 h-4" />,
265267
danger: true,
266-
onClick: handleDeleteFile,
268+
onClick: (file: KBFile) => {
269+
Modal.confirm({
270+
title: t("knowledgeBase.detail.confirm.deleteFileTitle"),
271+
content: t("knowledgeBase.detail.confirm.deleteFileDescription", { name: file.name }),
272+
okText: t("knowledgeBase.detail.confirm.okText"),
273+
okType: "danger",
274+
cancelText: t("knowledgeBase.detail.confirm.cancelText"),
275+
centered: true,
276+
onOk: () => handleDeleteFile(file),
277+
});
278+
},
267279
},
268280
];
269281

0 commit comments

Comments
 (0)