| 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
 |