| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | 
							- import { useBoolean } from 'ahooks'
 
- import { type MetadataBatchEditToServer, type MetadataItemInBatchEdit, type MetadataItemWithEdit, type MetadataItemWithValue, UpdateType } from '../types'
 
- import type { SimpleDocumentDetail } from '@/models/datasets'
 
- import { useMemo } from 'react'
 
- import { useBatchUpdateDocMetadata } from '@/service/knowledge/use-metadata'
 
- import Toast from '@/app/components/base/toast'
 
- import { t } from 'i18next'
 
- type Props = {
 
-   datasetId: string
 
-   docList: SimpleDocumentDetail[]
 
-   onUpdate: () => void
 
- }
 
- const useBatchEditDocumentMetadata = ({
 
-   datasetId,
 
-   docList,
 
-   onUpdate,
 
- }: Props) => {
 
-   const [isShowEditModal, {
 
-     setTrue: showEditModal,
 
-     setFalse: hideEditModal,
 
-   }] = useBoolean(false)
 
-   const metaDataList: MetadataItemWithValue[][] = (() => {
 
-     const res: MetadataItemWithValue[][] = []
 
-     docList.forEach((item) => {
 
-       if (item.doc_metadata) {
 
-         res.push(item.doc_metadata.filter(item => item.id !== 'built-in'))
 
-         return
 
-       }
 
-       res.push([])
 
-     })
 
-     return res
 
-   })()
 
-   // To check is key has multiple value
 
-   const originalList: MetadataItemInBatchEdit[] = useMemo(() => {
 
-     const idNameValue: Record<string, { value: string | number | null, isMultipleValue: boolean }> = {}
 
-     const res: MetadataItemInBatchEdit[] = []
 
-     metaDataList.forEach((metaData) => {
 
-       metaData.forEach((item) => {
 
-         if (idNameValue[item.id]?.isMultipleValue)
 
-           return
 
-         const itemInRes = res.find(i => i.id === item.id)
 
-         if (!idNameValue[item.id]) {
 
-           idNameValue[item.id] = {
 
-             value: item.value,
 
-             isMultipleValue: false,
 
-           }
 
-         }
 
-         if (itemInRes && itemInRes.value !== item.value) {
 
-           idNameValue[item.id].isMultipleValue = true
 
-           itemInRes.isMultipleValue = true
 
-           itemInRes.value = null
 
-           return
 
-         }
 
-         if (!itemInRes) {
 
-           res.push({
 
-             ...item,
 
-             isMultipleValue: false,
 
-           })
 
-         }
 
-       })
 
-     })
 
-     return res
 
-   }, [metaDataList])
 
-   const formateToBackendList = (editedList: MetadataItemWithEdit[], addedList: MetadataItemInBatchEdit[], isApplyToAllSelectDocument: boolean) => {
 
-     const updatedList = editedList.filter((editedItem) => {
 
-       return editedItem.updateType === UpdateType.changeValue
 
-     })
 
-     const removedList = originalList.filter((originalItem) => {
 
-       const editedItem = editedList.find(i => i.id === originalItem.id)
 
-       if (!editedItem) // removed item
 
-         return true
 
-       return false
 
-     })
 
-     const res: MetadataBatchEditToServer = docList.map((item, i) => {
 
-       // the new metadata will override the old one
 
-       const oldMetadataList = metaDataList[i]
 
-       let newMetadataList: MetadataItemWithValue[] = [...oldMetadataList, ...addedList]
 
-         .filter((item) => {
 
-           return !removedList.find(removedItem => removedItem.id === item.id)
 
-         })
 
-         .map(item => ({
 
-           id: item.id,
 
-           name: item.name,
 
-           type: item.type,
 
-           value: item.value,
 
-         }))
 
-       if (isApplyToAllSelectDocument) {
 
-         // add missing metadata item
 
-         updatedList.forEach((editedItem) => {
 
-           if (!newMetadataList.find(i => i.id === editedItem.id) && !editedItem.isMultipleValue)
 
-             newMetadataList.push(editedItem)
 
-         })
 
-       }
 
-       newMetadataList = newMetadataList.map((item) => {
 
-         const editedItem = updatedList.find(i => i.id === item.id)
 
-         if (editedItem)
 
-           return editedItem
 
-         return item
 
-       })
 
-       return {
 
-         document_id: item.id,
 
-         metadata_list: newMetadataList,
 
-       }
 
-     })
 
-     return res
 
-   }
 
-   const { mutateAsync } = useBatchUpdateDocMetadata()
 
-   const handleSave = async (editedList: MetadataItemInBatchEdit[], addedList: MetadataItemInBatchEdit[], isApplyToAllSelectDocument: boolean) => {
 
-     const backendList = formateToBackendList(editedList, addedList, isApplyToAllSelectDocument)
 
-     await mutateAsync({
 
-       dataset_id: datasetId,
 
-       metadata_list: backendList,
 
-     })
 
-     onUpdate()
 
-     hideEditModal()
 
-     Toast.notify({
 
-       type: 'success',
 
-       message: t('common.actionMsg.modifiedSuccessfully'),
 
-     })
 
-   }
 
-   return {
 
-     isShowEditModal,
 
-     showEditModal,
 
-     hideEditModal,
 
-     originalList,
 
-     handleSave,
 
-   }
 
- }
 
- export default useBatchEditDocumentMetadata
 
 
  |