浏览代码

feat: knowledge used by app can still be removed (#5811)

Joel 10 月之前
父节点
当前提交
78d41a27cc
共有 4 个文件被更改,包括 26 次插入6 次删除
  1. 18 6
      web/app/(commonLayout)/datasets/DatasetCard.tsx
  2. 1 0
      web/i18n/en-US/dataset.ts
  3. 1 0
      web/i18n/zh-Hans/dataset.ts
  4. 6 0
      web/service/datasets.ts

+ 18 - 6
web/app/(commonLayout)/datasets/DatasetCard.tsx

@@ -10,7 +10,7 @@ import {
 } from '@remixicon/react'
 } from '@remixicon/react'
 import Confirm from '@/app/components/base/confirm'
 import Confirm from '@/app/components/base/confirm'
 import { ToastContext } from '@/app/components/base/toast'
 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 type { DataSet } from '@/models/datasets'
 import Tooltip from '@/app/components/base/tooltip'
 import Tooltip from '@/app/components/base/tooltip'
 import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
 import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
@@ -36,6 +36,19 @@ const DatasetCard = ({
 
 
   const [showRenameModal, setShowRenameModal] = useState(false)
   const [showRenameModal, setShowRenameModal] = useState(false)
   const [showConfirmDelete, setShowConfirmDelete] = useState(false)
   const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+  const [confirmMessage, setConfirmMessage] = useState<string>('')
+  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 () => {
   const onConfirmDelete = useCallback(async () => {
     try {
     try {
       await deleteDataset(dataset.id)
       await deleteDataset(dataset.id)
@@ -44,10 +57,9 @@ const DatasetCard = ({
         onSuccess()
         onSuccess()
     }
     }
     catch (e: any) {
     catch (e: any) {
-      notify({ type: 'error', message: `${t('dataset.datasetDeleteFailed')}${'message' in e ? `: ${e.message}` : ''}` })
     }
     }
     setShowConfirmDelete(false)
     setShowConfirmDelete(false)
-  }, [dataset.id])
+  }, [dataset.id, notify, onSuccess, t])
 
 
   const Operations = (props: HtmlContentProps) => {
   const Operations = (props: HtmlContentProps) => {
     const onMouseLeave = async () => {
     const onMouseLeave = async () => {
@@ -63,7 +75,7 @@ const DatasetCard = ({
       e.stopPropagation()
       e.stopPropagation()
       props.onClick?.()
       props.onClick?.()
       e.preventDefault()
       e.preventDefault()
-      setShowConfirmDelete(true)
+      detectIsUsedByApp()
     }
     }
     return (
     return (
       <div className="relative w-full py-1" onMouseLeave={onMouseLeave}>
       <div className="relative w-full py-1" onMouseLeave={onMouseLeave}>
@@ -159,7 +171,7 @@ const DatasetCard = ({
               />
               />
             </div>
             </div>
           </div>
           </div>
-          <div className='!hidden group-hover:!flex shrink-0 mx-1 w-[1px] h-[14px] bg-gray-200'/>
+          <div className='!hidden group-hover:!flex shrink-0 mx-1 w-[1px] h-[14px] bg-gray-200' />
           <div className='!hidden group-hover:!flex shrink-0'>
           <div className='!hidden group-hover:!flex shrink-0'>
             <CustomPopover
             <CustomPopover
               htmlContent={<Operations />}
               htmlContent={<Operations />}
@@ -194,7 +206,7 @@ const DatasetCard = ({
       {showConfirmDelete && (
       {showConfirmDelete && (
         <Confirm
         <Confirm
           title={t('dataset.deleteDatasetConfirmTitle')}
           title={t('dataset.deleteDatasetConfirmTitle')}
-          content={t('dataset.deleteDatasetConfirmContent')}
+          content={confirmMessage}
           isShow={showConfirmDelete}
           isShow={showConfirmDelete}
           onClose={() => setShowConfirmDelete(false)}
           onClose={() => setShowConfirmDelete(false)}
           onConfirm={onConfirmDelete}
           onConfirm={onConfirmDelete}

+ 1 - 0
web/i18n/en-US/dataset.ts

@@ -8,6 +8,7 @@ const translation = {
   deleteDatasetConfirmTitle: 'Delete this Knowledge?',
   deleteDatasetConfirmTitle: 'Delete this Knowledge?',
   deleteDatasetConfirmContent:
   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.',
     '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',
   datasetDeleted: 'Knowledge deleted',
   datasetDeleteFailed: 'Failed to delete Knowledge',
   datasetDeleteFailed: 'Failed to delete Knowledge',
   didYouKnow: 'Did you know?',
   didYouKnow: 'Did you know?',

+ 1 - 0
web/i18n/zh-Hans/dataset.ts

@@ -8,6 +8,7 @@ const translation = {
   deleteDatasetConfirmTitle: '要删除知识库吗?',
   deleteDatasetConfirmTitle: '要删除知识库吗?',
   deleteDatasetConfirmContent:
   deleteDatasetConfirmContent:
     '删除知识库是不可逆的。用户将无法再访问您的知识库,所有的提示配置和日志将被永久删除。',
     '删除知识库是不可逆的。用户将无法再访问您的知识库,所有的提示配置和日志将被永久删除。',
+  datasetUsedByApp: '某些应用正在使用该知识库。应用将无法再使用该知识库,所有的提示配置和日志将被永久删除。',
   datasetDeleted: '知识库已删除',
   datasetDeleted: '知识库已删除',
   datasetDeleteFailed: '删除知识库失败',
   datasetDeleteFailed: '删除知识库失败',
   didYouKnow: '你知道吗?',
   didYouKnow: '你知道吗?',

+ 6 - 0
web/service/datasets.ts

@@ -72,6 +72,12 @@ export const createEmptyDataset: Fetcher<DataSet, { name: string }> = ({ name })
   return post<DataSet>('/datasets', { body: { name } })
   return post<DataSet>('/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<DataSet, string> = (datasetID) => {
 export const deleteDataset: Fetcher<DataSet, string> = (datasetID) => {
   return del<DataSet>(`/datasets/${datasetID}`)
   return del<DataSet>(`/datasets/${datasetID}`)
 }
 }