CzRger пре 3 месеци
родитељ
комит
def1a3f024

+ 8 - 4
web/app/(commonLayout)/datasets/Container.tsx

@@ -93,8 +93,12 @@ const Container = () => {
   const [optionsType, setOptionsType] = useState<any>([])
   useEffect(() => {
     fetchTypes({
-      url: '/workspaces/123123',
-      params: {},
+      url: '/tags/page',
+      params: {
+        page: 1,
+        limit: 1000,
+        tag_type: 'knowledge_category',
+      },
     }).then((res: any) => {
       setOptionsType(res.data.map((v: any) => ({ name: v.name, value: v.id })) || [])
     })
@@ -110,7 +114,7 @@ const Container = () => {
         {activeTab === 'dataset' && (
           <div className='flex items-center justify-center gap-2'>
             <SimpleSelect
-              className="h-[32px] w-[200px]"
+              wrapperClassName="h-[32px] w-[200px]"
               defaultValue={type}
               onSelect={(i) => {
                 setType(i.value)
@@ -150,7 +154,7 @@ const Container = () => {
       </div>
       {activeTab === 'dataset' && (
         <>
-          <Datasets containerRef={containerRef} tags={tagIDs} keywords={searchKeywords} includeAll={includeAll} type={searchType} optionsType={optionsType} />
+          <Datasets containerRef={containerRef} tags={tagIDs} keywords={searchKeywords} includeAll={includeAll} type={searchType} />
           <DatasetFooter />
           {showTagManagementModal && (
             <TagManagementModal type='knowledge' show={showTagManagementModal} />

+ 1 - 4
web/app/(commonLayout)/datasets/DatasetCard.tsx

@@ -24,13 +24,11 @@ import { useAppContext } from '@/context/app-context'
 export type DatasetCardProps = {
   dataset: DataSet
   onSuccess?: () => void,
-  optionsType: any[]
 }
 
 const DatasetCard = ({
   dataset,
   onSuccess,
-  optionsType,
 }: DatasetCardProps) => {
   const { t } = useTranslation()
   const { notify } = useContext(ToastContext)
@@ -39,7 +37,6 @@ const DatasetCard = ({
 
   const { isCurrentWorkspaceDatasetOperator } = useAppContext()
   const [tags, setTags] = useState<Tag[]>(dataset.tags)
-  const [type, setType] = useState<any>(dataset.type)
 
   const [showRenameModal, setShowRenameModal] = useState(false)
   const [showConfirmDelete, setShowConfirmDelete] = useState(false)
@@ -162,7 +159,7 @@ const DatasetCard = ({
               </div>
             </div>
           </div>
-          <div>{optionsType.filter((v: any) => v.value === type)[0]?.name}</div>
+          <div className="text-sm font-semibold text-text-secondary">{dataset.categories?.[0]?.name}</div>
         </div>
         <div
           className={cn(

+ 2 - 4
web/app/(commonLayout)/datasets/Datasets.tsx

@@ -32,7 +32,7 @@ const getKey = (
     if (keyword)
       params.params.keyword = keyword
     if (type)
-      params.params.type = type
+      params.params.category_ids = [type]
     return params
   }
   return null
@@ -44,7 +44,6 @@ type Props = {
   keywords: string
   includeAll: boolean,
   type: string,
-  optionsType: any[]
 }
 
 const Datasets = ({
@@ -53,7 +52,6 @@ const Datasets = ({
   keywords,
   includeAll,
   type,
-  optionsType,
 }: Props) => {
   const { isCurrentWorkspaceEditor } = useAppContext()
   const { data, isLoading, setSize, mutate } = useSWRInfinite(
@@ -96,7 +94,7 @@ const Datasets = ({
     <nav className='grid shrink-0 grow grid-cols-1 content-start gap-4 px-12 pt-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4'>
       { isCurrentWorkspaceEditor && <NewDatasetCard ref={anchorRef} /> }
       {data?.map(({ data: datasets }) => datasets.map(dataset => (
-        <DatasetCard key={dataset.id} dataset={dataset} onSuccess={mutate} optionsType={optionsType}/>),
+        <DatasetCard key={dataset.id} dataset={dataset} onSuccess={mutate}/>),
       ))}
     </nav>
   )

+ 1 - 3
web/app/components/base/select/index.tsx

@@ -187,7 +187,6 @@ const SimpleSelect: FC<ISelectProps> = ({
 }) => {
   const { t } = useTranslation()
   const localPlaceholder = placeholder || t('common.placeholder.select')
-
   const [selectedItem, setSelectedItem] = useState<Item | null>(null)
   useEffect(() => {
     let defaultSelect = null
@@ -196,8 +195,7 @@ const SimpleSelect: FC<ISelectProps> = ({
       defaultSelect = existed
 
     setSelectedItem(defaultSelect)
-    // eslint-disable-next-line react-hooks/exhaustive-deps
-  }, [defaultValue])
+  }, [defaultValue, items])
 
   return (
     <Listbox

+ 26 - 5
web/app/components/datasets/rename-modal/index.tsx

@@ -14,7 +14,7 @@ import { SimpleSelect } from '@/app/components/base/select'
 import Modal from '@/app/components/base/modal'
 import { ToastContext } from '@/app/components/base/toast'
 import type { DataSet } from '@/models/datasets'
-import { updateDatasetSetting } from '@/service/datasets'
+import { tagBindingsCreate, tagBindingsRemove, updateDatasetSetting } from '@/service/datasets'
 import { useModalContext } from '@/context/modal-context'
 import { fetchTypes } from '@/service/common'
 
@@ -33,12 +33,16 @@ const RenameDatasetModal = ({ show, dataset, onSuccess, onClose }: RenameDataset
   const [description, setDescription] = useState<string>(dataset.description)
   const [externalKnowledgeId, setExternalKnowledgeId] = useState<string>(dataset.external_knowledge_info.external_knowledge_id)
   const [externalKnowledgeApiId, setExternalKnowledgeApiId] = useState<string>(dataset.external_knowledge_info.external_knowledge_api_id)
-  const [type, setType] = useState<any>(dataset.type)
+  const [type, setType] = useState<any>(dataset.categories[0]?.id)
   const [options, setOptions] = useState<any>([])
   useEffect(() => {
     fetchTypes({
-      url: '/workspaces/123123',
-      params: {},
+      url: '/tags/page',
+      params: {
+        page: 1,
+        limit: 1000,
+        tag_type: 'knowledge_category',
+      },
     }).then((res: any) => {
       setOptions(res.data.map((v: any) => ({ name: v.name, value: v.id })) || [])
     })
@@ -54,7 +58,6 @@ const RenameDatasetModal = ({ show, dataset, onSuccess, onClose }: RenameDataset
       const body: Partial<DataSet> & { external_knowledge_id?: string; external_knowledge_api_id?: string } = {
         name,
         description,
-        type,
       }
       if (externalKnowledgeId && externalKnowledgeApiId) {
         body.external_knowledge_id = externalKnowledgeId
@@ -64,6 +67,24 @@ const RenameDatasetModal = ({ show, dataset, onSuccess, onClose }: RenameDataset
         datasetId: dataset.id,
         body,
       })
+      if (type) {
+        if (dataset.categories[0]) {
+          await tagBindingsRemove({
+            body: {
+              tag_id: dataset.categories[0].id,
+              target_id: dataset.id,
+              type: 'knowledge_category',
+            },
+          })
+        }
+        await tagBindingsCreate({
+          body: {
+            tag_ids: [type],
+            target_id: dataset.id,
+            type: 'knowledge_category',
+          },
+        })
+      }
       notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
       if (onSuccess)
         onSuccess()

+ 1 - 1
web/app/components/header/account-setting/types-page/index.tsx

@@ -123,7 +123,7 @@ const TypesPage = () => {
                       <RiAddLine className='mr-1 h-4 w-4' />
                       编辑
                     </Button>
-                    <Button variant='ghost' size='small' className={cn('shrink-0 text-red-600')} disabled={!isCurrentWorkspaceManager || isMemberFull} onClick={() => {
+                    <Button variant='ghost' size='small' className={cn('shrink-0 text-red-600')} disabled={!isCurrentWorkspaceManager || isMemberFull || Number(type.binding_count) > 0} onClick={() => {
                       setRow(type)
                       setShowConfirmDelete(true)
                     }}>

+ 2 - 2
web/models/datasets.ts

@@ -31,6 +31,7 @@ export type MetadataInDoc = {
 }
 
 export type DataSet = {
+  categories: any;
   id: string
   name: string
   icon: string
@@ -67,7 +68,6 @@ export type DataSet = {
   }
   built_in_field_enabled: boolean
   doc_metadata?: MetadataInDoc[],
-  type: string,
 }
 
 export type ExternalAPIItem = {
@@ -157,7 +157,7 @@ export type FetchDatasetsParams = {
     limit?: number
     include_all?: boolean
     keyword?: string,
-    type?: string,
+    category_ids?: string[],
   }
 }
 

+ 9 - 1
web/service/datasets.ts

@@ -57,12 +57,20 @@ export const fetchDatasetDetail: Fetcher<DataSet, string> = (datasetId: string)
 export const updateDatasetSetting: Fetcher<DataSet, {
   datasetId: string
   body: Partial<Pick<DataSet,
-    'name' | 'description' | 'permission' | 'partial_member_list' | 'indexing_technique' | 'retrieval_model' | 'embedding_model' | 'embedding_model_provider' | 'type'
+    'name' | 'description' | 'permission' | 'partial_member_list' | 'indexing_technique' | 'retrieval_model' | 'embedding_model' | 'embedding_model_provider'
   >>
 }> = ({ datasetId, body }) => {
   return patch<DataSet>(`/datasets/${datasetId}`, { body })
 }
 
+export const tagBindingsCreate = ({ body }: any) => {
+  return post<DataSet>('/tag-bindings/create', { body })
+}
+
+export const tagBindingsRemove = ({ body }: any) => {
+  return post<DataSet>('/tag-bindings/remove', { body })
+}
+
 export const fetchDatasetRelatedApps: Fetcher<RelatedAppResponse, string> = (datasetId: string) => {
   return get<RelatedAppResponse>(`/datasets/${datasetId}/related-apps`)
 }