From 78d41a27cc3e15330968eaa11ff4a817f26e0274 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 1 Jul 2024 16:14:49 +0800 Subject: [PATCH] feat: knowledge used by app can still be removed (#5811) --- .../(commonLayout)/datasets/DatasetCard.tsx | 24 ++++++++++++++----- web/i18n/en-US/dataset.ts | 1 + web/i18n/zh-Hans/dataset.ts | 1 + web/service/datasets.ts | 6 +++++ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/web/app/(commonLayout)/datasets/DatasetCard.tsx b/web/app/(commonLayout)/datasets/DatasetCard.tsx index 8f13241424..df122bc298 100644 --- a/web/app/(commonLayout)/datasets/DatasetCard.tsx +++ b/web/app/(commonLayout)/datasets/DatasetCard.tsx @@ -10,7 +10,7 @@ import { } from '@remixicon/react' import Confirm from '@/app/components/base/confirm' import { ToastContext } from '@/app/components/base/toast' -import { deleteDataset } from '@/service/datasets' +import { checkIsUsedInApp, deleteDataset } from '@/service/datasets' import type { DataSet } from '@/models/datasets' import Tooltip from '@/app/components/base/tooltip' import { Folder } from '@/app/components/base/icons/src/vender/solid/files' @@ -36,6 +36,19 @@ const DatasetCard = ({ const [showRenameModal, setShowRenameModal] = useState(false) const [showConfirmDelete, setShowConfirmDelete] = useState(false) + const [confirmMessage, setConfirmMessage] = useState('') + const detectIsUsedByApp = useCallback(async () => { + try { + const { is_using: isUsedByApp } = await checkIsUsedInApp(dataset.id) + setConfirmMessage(isUsedByApp ? t('dataset.datasetUsedByApp')! : t('dataset.deleteDatasetConfirmContent')!) + } + catch (e: any) { + const res = await e.json() + notify({ type: 'error', message: res?.message || 'Unknown error' }) + } + + setShowConfirmDelete(true) + }, [dataset.id, notify, t]) const onConfirmDelete = useCallback(async () => { try { await deleteDataset(dataset.id) @@ -44,10 +57,9 @@ const DatasetCard = ({ onSuccess() } catch (e: any) { - notify({ type: 'error', message: `${t('dataset.datasetDeleteFailed')}${'message' in e ? `: ${e.message}` : ''}` }) } setShowConfirmDelete(false) - }, [dataset.id]) + }, [dataset.id, notify, onSuccess, t]) const Operations = (props: HtmlContentProps) => { const onMouseLeave = async () => { @@ -63,7 +75,7 @@ const DatasetCard = ({ e.stopPropagation() props.onClick?.() e.preventDefault() - setShowConfirmDelete(true) + detectIsUsedByApp() } return (
@@ -159,7 +171,7 @@ const DatasetCard = ({ />
-
+
} @@ -194,7 +206,7 @@ const DatasetCard = ({ {showConfirmDelete && ( setShowConfirmDelete(false)} onConfirm={onConfirmDelete} diff --git a/web/i18n/en-US/dataset.ts b/web/i18n/en-US/dataset.ts index dee495fbd4..8251693154 100644 --- a/web/i18n/en-US/dataset.ts +++ b/web/i18n/en-US/dataset.ts @@ -8,6 +8,7 @@ const translation = { deleteDatasetConfirmTitle: 'Delete this Knowledge?', deleteDatasetConfirmContent: 'Deleting the Knowledge is irreversible. Users will no longer be able to access your Knowledge, and all prompt configurations and logs will be permanently deleted.', + datasetUsedByApp: 'The knowledge is being used by some apps. Apps will no longer be able to use this Knowledge, and all prompt configurations and logs will be permanently deleted.', datasetDeleted: 'Knowledge deleted', datasetDeleteFailed: 'Failed to delete Knowledge', didYouKnow: 'Did you know?', diff --git a/web/i18n/zh-Hans/dataset.ts b/web/i18n/zh-Hans/dataset.ts index 57b20a1abc..20881ab57e 100644 --- a/web/i18n/zh-Hans/dataset.ts +++ b/web/i18n/zh-Hans/dataset.ts @@ -8,6 +8,7 @@ const translation = { deleteDatasetConfirmTitle: '要删除知识库吗?', deleteDatasetConfirmContent: '删除知识库是不可逆的。用户将无法再访问您的知识库,所有的提示配置和日志将被永久删除。', + datasetUsedByApp: '某些应用正在使用该知识库。应用将无法再使用该知识库,所有的提示配置和日志将被永久删除。', datasetDeleted: '知识库已删除', datasetDeleteFailed: '删除知识库失败', didYouKnow: '你知道吗?', diff --git a/web/service/datasets.ts b/web/service/datasets.ts index 35330a0dec..a0905208fa 100644 --- a/web/service/datasets.ts +++ b/web/service/datasets.ts @@ -72,6 +72,12 @@ export const createEmptyDataset: Fetcher = ({ name }) return post('/datasets', { body: { name } }) } +export const checkIsUsedInApp: Fetcher<{ is_using: boolean }, string> = (id) => { + return get<{ is_using: boolean }>(`/datasets/${id}/use-check`, {}, { + silent: true, + }) +} + export const deleteDataset: Fetcher = (datasetID) => { return del(`/datasets/${datasetID}`) }