diff --git a/web/src/components/ui/dropdown-menu.tsx b/web/src/components/ui/dropdown-menu.tsx index 002032847..6fadf9765 100644 --- a/web/src/components/ui/dropdown-menu.tsx +++ b/web/src/components/ui/dropdown-menu.tsx @@ -78,13 +78,15 @@ const DropdownMenuItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { inset?: boolean; + justifyBetween?: boolean; } ->(({ className, inset, ...props }, ref) => ( +>(({ className, inset, justifyBetween = true, ...props }, ref) => ( { //#region knowledge configuration -export const useUpdateKnowledge = () => { +export const useUpdateKnowledge = (shouldFetchList = false) => { const knowledgeBaseId = useKnowledgeBaseId(); const queryClient = useQueryClient(); const { @@ -191,12 +191,18 @@ export const useUpdateKnowledge = () => { mutationKey: ['saveKnowledge'], mutationFn: async (params: Record) => { const { data = {} } = await kbService.updateKb({ - kb_id: knowledgeBaseId, + kb_id: params?.kb_id ? params?.kb_id : knowledgeBaseId, ...params, }); if (data.code === 0) { message.success(i18n.t(`message.updated`)); - queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeDetail'] }); + if (shouldFetchList) { + queryClient.invalidateQueries({ + queryKey: ['infiniteFetchKnowledgeList'], + }); + } else { + queryClient.invalidateQueries({ queryKey: ['fetchKnowledgeDetail'] }); + } } return data; }, diff --git a/web/src/pages/datasets/dataset-creating-dialog.tsx b/web/src/pages/datasets/dataset-creating-dialog.tsx index cf4a832bb..3d10d6d4e 100644 --- a/web/src/pages/datasets/dataset-creating-dialog.tsx +++ b/web/src/pages/datasets/dataset-creating-dialog.tsx @@ -23,7 +23,7 @@ import { z } from 'zod'; const FormId = 'dataset-creating-form'; -export function InputForm() { +export function InputForm({ onOk }: IModalProps) { const { t } = useTranslation(); const FormSchema = z.object({ @@ -43,7 +43,7 @@ export function InputForm() { }); function onSubmit(data: z.infer) { - console.log('🚀 ~ onSubmit ~ data:', data); + onOk?.(data.name); } return ( @@ -74,7 +74,7 @@ export function InputForm() { ); } -export function DatasetCreatingDialog({ hideModal }: IModalProps) { +export function DatasetCreatingDialog({ hideModal, onOk }: IModalProps) { const { t } = useTranslation(); return ( @@ -83,7 +83,7 @@ export function DatasetCreatingDialog({ hideModal }: IModalProps) { {t('knowledgeList.createKnowledgeBase')} - + - +
@@ -92,6 +106,14 @@ export default function Datasets() { loading={creatingLoading} > )} + {datasetRenameVisible && ( + + )} ); } diff --git a/web/src/pages/datasets/use-rename-dataset.ts b/web/src/pages/datasets/use-rename-dataset.ts new file mode 100644 index 000000000..0612f6762 --- /dev/null +++ b/web/src/pages/datasets/use-rename-dataset.ts @@ -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({} 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, + }; +}; diff --git a/web/tailwind.config.js b/web/tailwind.config.js index 8ddaeb9b6..12876b8cc 100644 --- a/web/tailwind.config.js +++ b/web/tailwind.config.js @@ -40,6 +40,7 @@ module.exports = { 'colors-text-inverse-strong': 'var(--colors-text-inverse-strong)', 'colors-text-persist-light': 'var(--colors-text-persist-light)', 'colors-text-inverse-weak': 'var(--colors-text-inverse-weak)', + 'text-delete-red': 'var(--text-delete-red)', primary: { DEFAULT: 'hsl(var(--primary))', diff --git a/web/tailwind.css b/web/tailwind.css index 5a81e6a49..9bbd55f30 100644 --- a/web/tailwind.css +++ b/web/tailwind.css @@ -61,6 +61,7 @@ --colors-text-inverse-strong: rgba(255, 255, 255, 1); --colors-text-persist-light: rgba(255, 255, 255, 1); --colors-text-inverse-weak: rgba(184, 181, 203, 1); + --text-delete-red: rgba(216, 73, 75, 1); --sidebar-background: 0 0% 98%; --sidebar-foreground: 240 5.3% 26.1%; @@ -153,6 +154,7 @@ --colors-text-inverse-strong: rgba(17, 16, 23, 1); --colors-text-persist-light: rgba(255, 255, 255, 1); --colors-text-inverse-weak: rgba(84, 80, 106, 1); + --text-delete-red: rgba(216, 73, 75, 1); --sidebar-background: 240 5.9% 10%; --sidebar-foreground: 240 4.8% 95.9%;