feat: add use api

This commit is contained in:
Joel 2025-02-21 15:50:43 +08:00
parent ac36ea047c
commit de0b22af9c
9 changed files with 60 additions and 17 deletions

View File

@ -241,6 +241,7 @@ const Documents: FC<IDocumentsProps> = ({ datasetId }) => {
showEditModal: showEditMetadataModal, showEditModal: showEditMetadataModal,
hideEditModal: hideEditMetadataModal, hideEditModal: hideEditMetadataModal,
datasetMetaData, datasetMetaData,
handleAddMetaData,
handleDeleteMetaData, handleDeleteMetaData,
builtInEnabled, builtInEnabled,
setBuiltInEnabled, setBuiltInEnabled,
@ -291,6 +292,7 @@ const Documents: FC<IDocumentsProps> = ({ datasetId }) => {
onIsBuiltInEnabledChange={setBuiltInEnabled} onIsBuiltInEnabledChange={setBuiltInEnabled}
onClose={hideEditMetadataModal} onClose={hideEditMetadataModal}
onChange={() => { }} onChange={() => { }}
onAdd={handleAddMetaData}
onRemove={handleDeleteMetaData} onRemove={handleDeleteMetaData}
/> />
)} )}

View File

@ -1,7 +1,8 @@
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import { useBuiltInMetaData, useDatasetMetaData, useDeleteMetaData, useUpdateBuiltInStatus } from '@/service/knowledge/use-metadata' import { useBuiltInMetaData, useCreateMetaData, useDatasetMetaData, useDeleteMetaData, useUpdateBuiltInStatus } from '@/service/knowledge/use-metadata'
import type { DataSet } from '@/models/datasets' import type { DataSet } from '@/models/datasets'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import type { BuiltInMetadataItem } from '../types'
const useEditDocumentMetadata = ({ const useEditDocumentMetadata = ({
datasetId, datasetId,
@ -16,6 +17,12 @@ const useEditDocumentMetadata = ({
}] = useBoolean(false) }] = useBoolean(false)
const { data: datasetMetaData } = useDatasetMetaData(datasetId) const { data: datasetMetaData } = useDatasetMetaData(datasetId)
const { mutate: doAddMetaData } = useCreateMetaData(datasetId)
const handleAddMetaData = useCallback((payload: BuiltInMetadataItem) => {
doAddMetaData(payload)
}, [doAddMetaData])
const { mutate: doDeleteMetaData } = useDeleteMetaData(datasetId) const { mutate: doDeleteMetaData } = useDeleteMetaData(datasetId)
const handleDeleteMetaData = useCallback((metaDataId: string) => { const handleDeleteMetaData = useCallback((metaDataId: string) => {
doDeleteMetaData(metaDataId) doDeleteMetaData(metaDataId)
@ -29,6 +36,7 @@ const useEditDocumentMetadata = ({
showEditModal, showEditModal,
hideEditModal, hideEditModal,
datasetMetaData: datasetMetaData?.data, datasetMetaData: datasetMetaData?.data,
handleAddMetaData,
handleDeleteMetaData, handleDeleteMetaData,
builtInMetaData: builtInMetaData?.fields, builtInMetaData: builtInMetaData?.fields,
builtInEnabled, builtInEnabled,

View File

@ -12,12 +12,14 @@ import { useTranslation } from 'react-i18next'
const i18nPrefix = 'dataset.metadata.createMetadata' const i18nPrefix = 'dataset.metadata.createMetadata'
export type Props = { export type Props = {
onClose?: () => void
onSave: (data: any) => void onSave: (data: any) => void
hasBack?: boolean hasBack?: boolean
onBack?: () => void onBack?: () => void
} }
const CreateContent: FC<Props> = ({ const CreateContent: FC<Props> = ({
onClose = () => { },
hasBack, hasBack,
onBack, onBack,
onSave, onSave,
@ -43,7 +45,7 @@ const CreateContent: FC<Props> = ({
return ( return (
<ModalLikeWrap <ModalLikeWrap
title={t(`${i18nPrefix}.title`)} title={t(`${i18nPrefix}.title`)}
onClose={() => { }} onClose={onClose}
onConfirm={handleSave} onConfirm={handleSave}
hideCloseBtn={hasBack} hideCloseBtn={hasBack}
beforeHeader={hasBack && ( beforeHeader={hasBack && (

View File

@ -1,23 +1,25 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React, { useState } from 'react' import React from 'react'
import type { Props as CreateContentProps } from './create-content' import type { Props as CreateContentProps } from './create-content'
import CreateContent from './create-content' import CreateContent from './create-content'
import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../../base/portal-to-follow-elem' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../../base/portal-to-follow-elem'
type Props = { type Props = {
open: boolean
setOpen: (open: boolean) => void
onSave: (data: any) => void onSave: (data: any) => void
trigger: React.ReactNode trigger: React.ReactNode
popupLeft?: number popupLeft?: number
} & CreateContentProps } & CreateContentProps
const CreateMetadataModal: FC<Props> = ({ const CreateMetadataModal: FC<Props> = ({
open,
setOpen,
trigger, trigger,
popupLeft = 20, popupLeft = 20,
...createContentProps ...createContentProps
}) => { }) => {
const [open, setOpen] = useState(false)
return ( return (
<PortalToFollowElem <PortalToFollowElem
open={open} open={open}
@ -34,7 +36,7 @@ const CreateMetadataModal: FC<Props> = ({
{trigger} {trigger}
</PortalToFollowElemTrigger> </PortalToFollowElemTrigger>
<PortalToFollowElemContent className='z-[1000]'> <PortalToFollowElemContent className='z-[1000]'>
<CreateContent {...createContentProps} /> <CreateContent {...createContentProps} onClose={() => setOpen(false)} />
</PortalToFollowElemContent> </PortalToFollowElemContent>
</PortalToFollowElem > </PortalToFollowElem >

View File

@ -28,6 +28,7 @@ type Props = {
onIsBuiltInEnabledChange: (value: boolean) => void onIsBuiltInEnabledChange: (value: boolean) => void
onClose: () => void onClose: () => void
onChange: (data: MetadataItemWithValueLength[]) => void onChange: (data: MetadataItemWithValueLength[]) => void
onAdd: (payload: BuiltInMetadataItem) => void
onRemove: (metaDataId: string) => void onRemove: (metaDataId: string) => void
} }
@ -96,8 +97,8 @@ const Item: FC<ItemProps> = ({
<Confirm <Confirm
isShow isShow
type='warning' type='warning'
title={'Confirm to delete'} title={t('dataset.metadata.datasetMetadata.deleteTitle')}
content={`Are you sure you want to delete the metadata "${payload.name}"?`} content={t('dataset.metadata.datasetMetadata.deleteContent', { name: payload.name })}
onConfirm={handleDelete} onConfirm={handleDelete}
onCancel={hideDeleteConfirm} onCancel={hideDeleteConfirm}
/> />
@ -114,6 +115,7 @@ const DatasetMetadataDrawer: FC<Props> = ({
onIsBuiltInEnabledChange, onIsBuiltInEnabledChange,
onClose, onClose,
onChange, onChange,
onAdd,
onRemove, onRemove,
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
@ -128,12 +130,15 @@ const DatasetMetadataDrawer: FC<Props> = ({
} }
}, [setCurrPayload, setIsShowRenameModal]) }, [setCurrPayload, setIsShowRenameModal])
const handleAdd = useCallback((data: MetadataItemWithValueLength) => { const [open, setOpen] = useState(false)
const nextUserMetadata = produce(userMetadata, (draft) => { const handleAdd = useCallback(async (data: MetadataItemWithValueLength) => {
draft.push(data) await onAdd(data)
Toast.notify({
type: 'success',
message: t('common.api.success'),
}) })
onChange(nextUserMetadata) setOpen(false)
}, [userMetadata, onChange]) }, [onAdd, t])
const handleRenamed = useCallback(() => { const handleRenamed = useCallback(() => {
const nextUserMetadata = produce(userMetadata, (draft) => { const nextUserMetadata = produce(userMetadata, (draft) => {
@ -167,10 +172,14 @@ const DatasetMetadataDrawer: FC<Props> = ({
> >
<div className='system-sm-regular text-text-tertiary'>{t(`${i18nPrefix}.description`)}</div> <div className='system-sm-regular text-text-tertiary'>{t(`${i18nPrefix}.description`)}</div>
<CreateModal trigger={<Button variant='primary' className='mt-3'> <CreateModal
<RiAddLine className='mr-1' /> open={open}
{t(`${i18nPrefix}.addMetaData`)} setOpen={setOpen}
</Button>} hasBack onSave={handleAdd} /> trigger={<Button variant='primary' className='mt-3'>
<RiAddLine className='mr-1' />
{t(`${i18nPrefix}.addMetaData`)}
</Button>} hasBack onSave={handleAdd}
/>
<div className='mt-3 space-y-1'> <div className='mt-3 space-y-1'>
{userMetadata.map(payload => ( {userMetadata.map(payload => (

View File

@ -20,6 +20,7 @@ export type MetadataItemWithValue = MetadataItem & {
export type MetadataItemWithValueLength = MetadataItem & { export type MetadataItemWithValueLength = MetadataItem & {
use_count: number use_count: number
} }
export enum UpdateType { export enum UpdateType {
changeValue = 'changeValue', changeValue = 'changeValue',
delete = 'delete', delete = 'delete',

View File

@ -200,6 +200,8 @@ const translation = {
namePlaceholder: 'Metadata name', namePlaceholder: 'Metadata name',
builtIn: 'Built-in', builtIn: 'Built-in',
builtInDescription: 'Built-in metadata is automatically extracted and generated. It must be enabled before use and cannot be edited.', builtInDescription: 'Built-in metadata is automatically extracted and generated. It must be enabled before use and cannot be edited.',
deleteTitle: 'Confirm to delete',
deleteContent: 'Are you sure you want to delete the metadata "{{name}}"',
}, },
documentMetadata: { documentMetadata: {
metadataToolTip: 'Metadata serves as a critical filter that enhances the accuracy and relevance of information retrieval. You can modify and add metadata for this document here.', metadataToolTip: 'Metadata serves as a critical filter that enhances the accuracy and relevance of information retrieval. You can modify and add metadata for this document here.',

View File

@ -200,6 +200,8 @@ const translation = {
namePlaceholder: '元数据名称', namePlaceholder: '元数据名称',
builtIn: '内置', builtIn: '内置',
builtInDescription: '内置元数据是系统预定义的元数据,您可以在此处查看和管理内置元数据。', builtInDescription: '内置元数据是系统预定义的元数据,您可以在此处查看和管理内置元数据。',
deleteTitle: '确定删除',
deleteContent: '你确定要删除元数据 "{{name}}" 吗?',
}, },
documentMetadata: { documentMetadata: {
metadataToolTip: '元数据是关于文档的数据,用于描述文档的属性。元数据可以帮助您更好地组织和管理文档。', metadataToolTip: '元数据是关于文档的数据,用于描述文档的属性。元数据可以帮助您更好地组织和管理文档。',

View File

@ -36,6 +36,21 @@ export const useInvalidDatasetMetaData = (datasetId: string) => {
return useInvalid([NAME_SPACE, 'dataset', datasetId]) return useInvalid([NAME_SPACE, 'dataset', datasetId])
} }
export const useCreateMetaData = (datasetId: string) => {
const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId)
return useMutation({
mutationFn: async (payload: BuiltInMetadataItem) => {
datasetMetaData.push({
id: `${Math.random()}`,
...payload,
use_count: 0,
})
await invalidDatasetMetaData()
return Promise.resolve(true)
},
})
}
export const useDeleteMetaData = (datasetId: string) => { export const useDeleteMetaData = (datasetId: string) => {
const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId) const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId)
return useMutation({ return useMutation({