| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | 
                        - 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[]
 -   selectedDocumentIds?: string[]
 -   onUpdate: () => void
 - }
 - 
 - const useBatchEditDocumentMetadata = ({
 -   datasetId,
 -   docList,
 -   selectedDocumentIds,
 -   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
 -     })
 - 
 -     // Use selectedDocumentIds if available, otherwise fall back to docList
 -     const documentIds = selectedDocumentIds || docList.map(doc => doc.id)
 -     const res: MetadataBatchEditToServer = documentIds.map((documentId) => {
 -       // Find the document in docList to get its metadata
 -       const docIndex = docList.findIndex(doc => doc.id === documentId)
 -       const oldMetadataList = docIndex >= 0 ? metaDataList[docIndex] : []
 -       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: documentId,
 -         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
 
 
  |