From 5043143bc52193ea0aba374af2a09dc8b74d6571 Mon Sep 17 00:00:00 2001 From: balibabu Date: Sun, 27 Apr 2025 16:12:10 +0800 Subject: [PATCH] Feat: Create empty document. #3221 (#7343) ### What problem does this PR solve? Feat: Create empty document. #3221 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/src/components/rename-dialog/index.tsx | 6 ++- web/src/hooks/use-document-request.ts | 40 +++++++++++++- .../dataset/dataset/dataset-action-cell.tsx | 22 ++++---- .../pages/dataset/dataset/dataset-table.tsx | 5 -- web/src/pages/dataset/dataset/hooks.ts | 30 +---------- web/src/pages/dataset/dataset/index.tsx | 52 ++++++++++++++++--- .../dataset/use-create-empty-document.ts | 31 +++++++++++ .../dataset/use-dataset-table-columns.tsx | 6 +-- web/src/pages/dataset/sidebar/index.tsx | 5 +- web/tailwind.css | 2 + 10 files changed, 137 insertions(+), 62 deletions(-) create mode 100644 web/src/pages/dataset/dataset/use-create-empty-document.ts diff --git a/web/src/components/rename-dialog/index.tsx b/web/src/components/rename-dialog/index.tsx index d9c002626..5c2a60516 100644 --- a/web/src/components/rename-dialog/index.tsx +++ b/web/src/components/rename-dialog/index.tsx @@ -8,6 +8,7 @@ import { import { LoadingButton } from '@/components/ui/loading-button'; import { IModalProps } from '@/interfaces/common'; import { TagRenameId } from '@/pages/add-knowledge/constant'; +import { ReactNode } from 'react'; import { useTranslation } from 'react-i18next'; import { RenameForm } from './rename-form'; @@ -16,14 +17,15 @@ export function RenameDialog({ initialName, onOk, loading, -}: IModalProps & { initialName?: string }) { + title, +}: IModalProps & { initialName?: string; title?: ReactNode }) { const { t } = useTranslation(); return ( - {t('common.rename')} + {title || t('common.rename')} { @@ -363,3 +367,37 @@ export const useSetDocumentMeta = () => { return { setDocumentMeta: mutateAsync, data, loading }; }; + +export const useCreateDocument = () => { + const { id } = useParams(); + const { setPaginationParams, page } = useSetPaginationParams(); + const queryClient = useQueryClient(); + + const { + data, + isPending: loading, + mutateAsync, + } = useMutation({ + mutationKey: [DocumentApiAction.CreateDocument], + mutationFn: async (name: string) => { + const { data } = await kbService.document_create({ + name, + kb_id: id, + }); + if (data.code === 0) { + if (page === 1) { + queryClient.invalidateQueries({ + queryKey: [DocumentApiAction.FetchDocumentList], + }); + } else { + setPaginationParams(); // fetch document list + } + + message.success(i18n.t('message.created')); + } + return data.code; + }, + }); + + return { createDocument: mutateAsync, loading, data }; +}; diff --git a/web/src/pages/dataset/dataset/dataset-action-cell.tsx b/web/src/pages/dataset/dataset/dataset-action-cell.tsx index 74c08c7af..23e2b1fcc 100644 --- a/web/src/pages/dataset/dataset/dataset-action-cell.tsx +++ b/web/src/pages/dataset/dataset/dataset-action-cell.tsx @@ -5,6 +5,7 @@ import { HoverCardContent, HoverCardTrigger, } from '@/components/ui/hover-card'; +import { DocumentType } from '@/constants/knowledge'; import { useRemoveDocument } from '@/hooks/use-document-request'; import { IDocumentInfo } from '@/interfaces/database/document'; import { formatFileSize } from '@/utils/common-util'; @@ -27,8 +28,9 @@ export function DatasetActionCell({ record, showRenameModal, }: { record: IDocumentInfo } & UseRenameDocumentShowType) { - const { id, run } = record; + const { id, run, type } = record; const isRunning = isParserRunning(run); + const isVirtualDocument = type === DocumentType.Virtual; const { removeDocument } = useRemoveDocument(); @@ -83,14 +85,16 @@ export function DatasetActionCell({ > - + {isVirtualDocument || ( + + )} + + + + + + + {t('fileManager.uploadFile')} + + + + {t('fileManager.newFolder')} + + + )} + {createVisible && ( + + )} ); } diff --git a/web/src/pages/dataset/dataset/use-create-empty-document.ts b/web/src/pages/dataset/dataset/use-create-empty-document.ts new file mode 100644 index 000000000..569fb461d --- /dev/null +++ b/web/src/pages/dataset/dataset/use-create-empty-document.ts @@ -0,0 +1,31 @@ +import { useSetModalState } from '@/hooks/common-hooks'; +import { useCreateDocument } from '@/hooks/use-document-request'; +import { useCallback } from 'react'; + +export const useCreateEmptyDocument = () => { + const { createDocument, loading } = useCreateDocument(); + + const { + visible: createVisible, + hideModal: hideCreateModal, + showModal: showCreateModal, + } = useSetModalState(); + + const onCreateOk = useCallback( + async (name: string) => { + const ret = await createDocument(name); + if (ret === 0) { + hideCreateModal(); + } + }, + [hideCreateModal, createDocument], + ); + + return { + createLoading: loading, + onCreateOk, + createVisible, + hideCreateModal, + showCreateModal, + }; +}; diff --git a/web/src/pages/dataset/dataset/use-dataset-table-columns.tsx b/web/src/pages/dataset/dataset/use-dataset-table-columns.tsx index 7b6e770ae..8af11fc96 100644 --- a/web/src/pages/dataset/dataset/use-dataset-table-columns.tsx +++ b/web/src/pages/dataset/dataset/use-dataset-table-columns.tsx @@ -22,14 +22,12 @@ import { UseChangeDocumentParserShowType } from './use-change-document-parser'; import { UseRenameDocumentShowType } from './use-rename-document'; import { UseSaveMetaShowType } from './use-save-meta'; -type UseDatasetTableColumnsType = UseChangeDocumentParserShowType & { - setCurrentRecord: (record: IDocumentInfo) => void; -} & UseRenameDocumentShowType & +type UseDatasetTableColumnsType = UseChangeDocumentParserShowType & + UseRenameDocumentShowType & UseSaveMetaShowType; export function useDatasetTableColumns({ showChangeParserModal, - setCurrentRecord, showRenameModal, showSetMetaModal, }: UseDatasetTableColumnsType) { diff --git a/web/src/pages/dataset/sidebar/index.tsx b/web/src/pages/dataset/sidebar/index.tsx index 09c4875ea..7adb287dc 100644 --- a/web/src/pages/dataset/sidebar/index.tsx +++ b/web/src/pages/dataset/sidebar/index.tsx @@ -31,7 +31,7 @@ export function SideBar() { const { data } = useFetchKnowledgeBaseConfiguration(); return ( -