Feat: Rename a dataset #3221 (#7162)

### What problem does this PR solve?

Feat: Rename a dataset #3221

### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu
2025-04-22 10:09:41 +08:00
committed by GitHub
parent ad220a0a3c
commit e7f83b13ca
9 changed files with 151 additions and 20 deletions

View File

@ -23,7 +23,7 @@ import { z } from 'zod';
const FormId = 'dataset-creating-form';
export function InputForm() {
export function InputForm({ onOk }: IModalProps<any>) {
const { t } = useTranslation();
const FormSchema = z.object({
@ -43,7 +43,7 @@ export function InputForm() {
});
function onSubmit(data: z.infer<typeof FormSchema>) {
console.log('🚀 ~ onSubmit ~ data:', data);
onOk?.(data.name);
}
return (
@ -74,7 +74,7 @@ export function InputForm() {
);
}
export function DatasetCreatingDialog({ hideModal }: IModalProps<any>) {
export function DatasetCreatingDialog({ hideModal, onOk }: IModalProps<any>) {
const { t } = useTranslation();
return (
@ -83,7 +83,7 @@ export function DatasetCreatingDialog({ hideModal }: IModalProps<any>) {
<DialogHeader>
<DialogTitle>{t('knowledgeList.createKnowledgeBase')}</DialogTitle>
</DialogHeader>
<InputForm></InputForm>
<InputForm onOk={onOk}></InputForm>
<DialogFooter>
<Button type="submit" variant={'tertiary'} size={'sm'} form={FormId}>
{t('common.save')}

View File

@ -0,0 +1,54 @@
import { ConfirmDeleteDialog } from '@/components/confirm-delete-dialog';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { useDeleteKnowledge } from '@/hooks/knowledge-hooks';
import { IKnowledge } from '@/interfaces/database/knowledge';
import { PenLine, Trash2 } from 'lucide-react';
import { PropsWithChildren, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { useRenameDataset } from './use-rename-dataset';
export function DatasetDropdown({
children,
showDatasetRenameModal,
dataset,
}: PropsWithChildren &
Pick<ReturnType<typeof useRenameDataset>, 'showDatasetRenameModal'> & {
dataset: IKnowledge;
}) {
const { t } = useTranslation();
const { deleteKnowledge } = useDeleteKnowledge();
const handleShowDatasetRenameModal = useCallback(() => {
showDatasetRenameModal(dataset);
}, [dataset, showDatasetRenameModal]);
const handleDelete = useCallback(() => {
deleteKnowledge(dataset.id);
}, [dataset.id, deleteKnowledge]);
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>{children}</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem onClick={handleShowDatasetRenameModal}>
{t('common.rename')} <PenLine />
</DropdownMenuItem>
<DropdownMenuSeparator />
<ConfirmDeleteDialog onOk={handleDelete}>
<DropdownMenuItem
className="text-text-delete-red"
onSelect={(e) => e.preventDefault()}
>
{t('common.delete')} <Trash2 />
</DropdownMenuItem>
</ConfirmDeleteDialog>
</DropdownMenuContent>
</DropdownMenu>
);
}

View File

@ -1,8 +1,7 @@
import { KnowledgeRouteKey } from '@/constants/knowledge';
import { useSetModalState } from '@/hooks/common-hooks';
import { useCreateKnowledge } from '@/hooks/knowledge-hooks';
import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
import { useCallback, useState } from 'react';
import { useNavigate } from 'umi';
export const useSearchKnowledge = () => {
const [searchString, setSearchString] = useState<string>('');
@ -19,7 +18,7 @@ export const useSearchKnowledge = () => {
export const useSaveKnowledge = () => {
const { visible: visible, hideModal, showModal } = useSetModalState();
const { loading, createKnowledge } = useCreateKnowledge();
const navigate = useNavigate();
const { navigateToDataset } = useNavigatePage();
const onCreateOk = useCallback(
async (name: string) => {
@ -29,12 +28,10 @@ export const useSaveKnowledge = () => {
if (ret?.code === 0) {
hideModal();
navigate(
`/knowledge/${KnowledgeRouteKey.Configuration}?id=${ret.data.kb_id}`,
);
navigateToDataset(ret.data.kb_id)();
}
},
[createKnowledge, hideModal, navigate],
[createKnowledge, hideModal, navigateToDataset],
);
return {

View File

@ -1,5 +1,5 @@
import { ConfirmDeleteDialog } from '@/components/confirm-delete-dialog';
import ListFilterBar from '@/components/list-filter-bar';
import { RenameDialog } from '@/components/rename-dialog';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
@ -7,10 +7,12 @@ import { useInfiniteFetchKnowledgeList } from '@/hooks/knowledge-hooks';
import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
import { IKnowledge } from '@/interfaces/database/knowledge';
import { formatDate } from '@/utils/date';
import { ChevronRight, Plus, Trash2 } from 'lucide-react';
import { ChevronRight, Ellipsis, Plus } from 'lucide-react';
import { useMemo } from 'react';
import { DatasetCreatingDialog } from './dataset-creating-dialog';
import { DatasetDropdown } from './dataset-dropdown';
import { useSaveKnowledge } from './hooks';
import { useRenameDataset } from './use-rename-dataset';
export default function Datasets() {
const {
@ -41,6 +43,15 @@ export default function Datasets() {
return data?.pages.at(-1).total ?? 0;
}, [data?.pages]);
const {
datasetRenameLoading,
initialDatasetName,
onDatasetRenameOk,
datasetRenameVisible,
hideDatasetRenameModal,
showDatasetRenameModal,
} = useRenameDataset();
return (
<section className="p-8 text-foreground">
<ListFilterBar title="Datasets" showDialog={showModal}>
@ -59,11 +70,14 @@ export default function Datasets() {
<AvatarImage src={dataset.avatar} />
<AvatarFallback className="rounded-lg">CN</AvatarFallback>
</Avatar>
<ConfirmDeleteDialog>
<DatasetDropdown
showDatasetRenameModal={showDatasetRenameModal}
dataset={dataset}
>
<Button variant="ghost" size="icon">
<Trash2 />
<Ellipsis />
</Button>
</ConfirmDeleteDialog>
</DatasetDropdown>
</div>
<div className="flex justify-between items-end">
<div>
@ -92,6 +106,14 @@ export default function Datasets() {
loading={creatingLoading}
></DatasetCreatingDialog>
)}
{datasetRenameVisible && (
<RenameDialog
hideModal={hideDatasetRenameModal}
onOk={onDatasetRenameOk}
initialName={initialDatasetName}
loading={datasetRenameLoading}
></RenameDialog>
)}
</section>
);
}

View File

@ -0,0 +1,47 @@
import { useSetModalState } from '@/hooks/common-hooks';
import { useUpdateKnowledge } from '@/hooks/knowledge-hooks';
import { IKnowledge } from '@/interfaces/database/knowledge';
import { omit } from 'lodash';
import { useCallback, useState } from 'react';
export const useRenameDataset = () => {
const [dataset, setDataset] = useState<IKnowledge>({} as IKnowledge);
const {
visible: datasetRenameVisible,
hideModal: hideDatasetRenameModal,
showModal: showDatasetRenameModal,
} = useSetModalState();
const { saveKnowledgeConfiguration, loading } = useUpdateKnowledge(true);
const onDatasetRenameOk = useCallback(
async (name: string) => {
const ret = await saveKnowledgeConfiguration({
...omit(dataset, ['id', 'update_time', 'nickname', 'tenant_avatar']),
kb_id: dataset.id,
name,
});
if (ret.code === 0) {
hideDatasetRenameModal();
}
},
[saveKnowledgeConfiguration, dataset, hideDatasetRenameModal],
);
const handleShowDatasetRenameModal = useCallback(
async (record: IKnowledge) => {
setDataset(record);
showDatasetRenameModal();
},
[showDatasetRenameModal],
);
return {
datasetRenameLoading: loading,
initialDatasetName: dataset?.name,
onDatasetRenameOk,
datasetRenameVisible,
hideDatasetRenameModal,
showDatasetRenameModal: handleShowDatasetRenameModal,
};
};