| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 | 
							- import { useBatchUpdateDocMetadata, useDatasetMetaData, useDocumentMetaData } from '@/service/knowledge/use-metadata'
 
- import { useDatasetDetailContext } from '@/context/dataset-detail'
 
- import type { BuiltInMetadataItem } from '../types'
 
- import { DataType, type MetadataItemWithValue } from '../types'
 
- import { useCallback, useState } from 'react'
 
- import Toast from '@/app/components/base/toast'
 
- import type { FullDocumentDetail } from '@/models/datasets'
 
- import { useTranslation } from 'react-i18next'
 
- import { useLanguages, useMetadataMap } from '@/hooks/use-metadata'
 
- import { get } from 'lodash-es'
 
- import { useCreateMetaData } from '@/service/knowledge/use-metadata'
 
- import useCheckMetadataName from './use-check-metadata-name'
 
- type Props = {
 
-   datasetId: string
 
-   documentId: string
 
-   docDetail: FullDocumentDetail
 
- }
 
- const useMetadataDocument = ({
 
-   datasetId,
 
-   documentId,
 
-   docDetail,
 
- }: Props) => {
 
-   const { t } = useTranslation()
 
-   const { dataset } = useDatasetDetailContext()
 
-   const embeddingAvailable = !!dataset?.embedding_available
 
-   const { mutateAsync } = useBatchUpdateDocMetadata()
 
-   const { checkName } = useCheckMetadataName()
 
-   const [isEdit, setIsEdit] = useState(false)
 
-   const { data: documentDetail } = useDocumentMetaData({
 
-     datasetId,
 
-     documentId,
 
-   })
 
-   const allList = documentDetail?.doc_metadata || []
 
-   const list = allList.filter(item => item.id !== 'built-in')
 
-   const builtList = allList.filter(item => item.id === 'built-in')
 
-   const [tempList, setTempList] = useState<MetadataItemWithValue[]>(list)
 
-   const { mutateAsync: doAddMetaData } = useCreateMetaData(datasetId)
 
-   const handleSelectMetaData = useCallback((metaData: MetadataItemWithValue) => {
 
-     setTempList((prev) => {
 
-       const index = prev.findIndex(item => item.id === metaData.id)
 
-       if (index === -1)
 
-         return [...prev, metaData]
 
-       return prev
 
-     })
 
-   }, [])
 
-   const handleAddMetaData = useCallback(async (payload: BuiltInMetadataItem) => {
 
-     const errorMsg = checkName(payload.name).errorMsg
 
-     if (errorMsg) {
 
-       Toast.notify({
 
-         message: errorMsg,
 
-         type: 'error',
 
-       })
 
-       return Promise.reject(new Error(errorMsg))
 
-     }
 
-     await doAddMetaData(payload)
 
-     Toast.notify({
 
-       type: 'success',
 
-       message: t('common.api.actionSuccess'),
 
-     })
 
-   }, [checkName, doAddMetaData, t])
 
-   const hasData = list.length > 0
 
-   const handleSave = async () => {
 
-     await mutateAsync({
 
-       dataset_id: datasetId,
 
-       metadata_list: [{
 
-         document_id: documentId,
 
-         metadata_list: tempList,
 
-       }],
 
-     })
 
-     setIsEdit(false)
 
-     Toast.notify({
 
-       type: 'success',
 
-       message: t('common.api.actionSuccess'),
 
-     })
 
-   }
 
-   const handleCancel = () => {
 
-     setTempList(list)
 
-     setIsEdit(false)
 
-   }
 
-   const startToEdit = () => {
 
-     setTempList(list)
 
-     setIsEdit(true)
 
-   }
 
-   // built in enabled is set in dataset
 
-   const { data: datasetMetaData } = useDatasetMetaData(datasetId)
 
-   const builtInEnabled = datasetMetaData?.built_in_field_enabled
 
-   // old metadata and technical params
 
-   const metadataMap = useMetadataMap()
 
-   const languageMap = useLanguages()
 
-   const getReadOnlyMetaData = (mainField: 'originInfo' | 'technicalParameters') => {
 
-     const fieldMap = metadataMap[mainField]?.subFieldsMap
 
-     const sourceData = docDetail
 
-     const getTargetMap = (field: string) => {
 
-       if (field === 'language')
 
-         return languageMap
 
-       return {} as any
 
-     }
 
-     const getTargetValue = (field: string) => {
 
-       const val = get(sourceData, field, '')
 
-       if (!val && val !== 0)
 
-         return '-'
 
-       if (fieldMap[field]?.inputType === 'select')
 
-         return getTargetMap(field)[val]
 
-       if (fieldMap[field]?.render)
 
-         return fieldMap[field]?.render?.(val, field === 'hit_count' ? get(sourceData, 'segment_count', 0) as number : undefined)
 
-       return val
 
-     }
 
-     const fieldList = Object.keys(fieldMap).map((key) => {
 
-       const field = fieldMap[key]
 
-       return {
 
-         id: field?.label,
 
-         type: DataType.string,
 
-         name: field?.label,
 
-         value: getTargetValue(key),
 
-       }
 
-     })
 
-     return fieldList
 
-   }
 
-   const originInfo = getReadOnlyMetaData('originInfo')
 
-   const technicalParameters = getReadOnlyMetaData('technicalParameters')
 
-   return {
 
-     embeddingAvailable,
 
-     isEdit,
 
-     setIsEdit,
 
-     list,
 
-     tempList,
 
-     setTempList,
 
-     handleSelectMetaData,
 
-     handleAddMetaData,
 
-     hasData,
 
-     builtList,
 
-     builtInEnabled,
 
-     startToEdit,
 
-     handleSave,
 
-     handleCancel,
 
-     originInfo,
 
-     technicalParameters,
 
-   }
 
- }
 
- export default useMetadataDocument
 
 
  |