diff --git a/web/src/pages/dataset/dataset-setting/configuration/common-item.tsx b/web/src/pages/dataset/dataset-setting/configuration/common-item.tsx index 0aae7ae0a..9a6af0ccf 100644 --- a/web/src/pages/dataset/dataset-setting/configuration/common-item.tsx +++ b/web/src/pages/dataset/dataset-setting/configuration/common-item.tsx @@ -25,13 +25,14 @@ import { useComposeLlmOptionsByModelTypes } from '@/hooks/use-llm-request'; import { cn } from '@/lib/utils'; import { t } from 'i18next'; import { Settings } from 'lucide-react'; -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { ControllerRenderProps, FieldValues, useFormContext, } from 'react-hook-form'; -import { useLocation } from 'umi'; +import { history, useLocation } from 'umi'; +import { DataSetContext } from '..'; import { MetadataType, useManageMetadata, @@ -371,6 +372,7 @@ export function AutoMetadata({ // get metadata field const location = useLocation(); const form = useFormContext(); + const datasetContext = useContext(DataSetContext); const { manageMetadataVisible, showManageMetadataModal, @@ -394,13 +396,14 @@ export function AutoMetadata({ const locationState = location.state as | { openMetadata?: boolean } | undefined; - if (locationState?.openMetadata) { + if (locationState?.openMetadata && !datasetContext?.loading) { setTimeout(() => { handleClickOpenMetadata(); - }, 100); + }, 0); locationState.openMetadata = false; + history.replace({ ...location }, locationState); } - }, [location, handleClickOpenMetadata]); + }, [location, handleClickOpenMetadata, datasetContext]); const autoMetadataField: FormFieldConfig = { name: 'parser_config.enable_metadata', diff --git a/web/src/pages/dataset/dataset-setting/hooks.ts b/web/src/pages/dataset/dataset-setting/hooks.ts index db67bda21..66f510eac 100644 --- a/web/src/pages/dataset/dataset-setting/hooks.ts +++ b/web/src/pages/dataset/dataset-setting/hooks.ts @@ -37,7 +37,8 @@ export function useHasParsedDocument(isEdit?: boolean) { export const useFetchKnowledgeConfigurationOnMount = ( form: UseFormReturn, any, undefined>, ) => { - const { data: knowledgeDetails } = useFetchKnowledgeBaseConfiguration(); + const { data: knowledgeDetails, loading } = + useFetchKnowledgeBaseConfiguration(); useEffect(() => { const parser_config = { @@ -71,7 +72,7 @@ export const useFetchKnowledgeConfigurationOnMount = ( form.reset(formValues); }, [form, knowledgeDetails]); - return knowledgeDetails; + return { knowledgeDetails, loading }; }; export const useSelectKnowledgeDetailsLoading = () => diff --git a/web/src/pages/dataset/dataset-setting/index.tsx b/web/src/pages/dataset/dataset-setting/index.tsx index 81fbc4c53..b3d9f87a2 100644 --- a/web/src/pages/dataset/dataset-setting/index.tsx +++ b/web/src/pages/dataset/dataset-setting/index.tsx @@ -7,11 +7,11 @@ import { Form } from '@/components/ui/form'; import { FormLayout } from '@/constants/form'; import { DocumentParserType } from '@/constants/knowledge'; import { PermissionRole } from '@/constants/permission'; -import { IConnector } from '@/interfaces/database/knowledge'; +import { IConnector, IKnowledge } from '@/interfaces/database/knowledge'; import { useDataSourceInfo } from '@/pages/user-setting/data-source/constant'; import { IDataSourceBase } from '@/pages/user-setting/data-source/interface'; import { zodResolver } from '@hookform/resolvers/zod'; -import { useEffect, useState } from 'react'; +import { createContext, useEffect, useState } from 'react'; import { useForm, useWatch } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { z } from 'zod'; @@ -35,6 +35,10 @@ const enum DocumentType { DeepDOC = 'DeepDOC', PlainText = 'Plain Text', } +export const DataSetContext = createContext<{ + loading: boolean; + knowledgeDetails: IKnowledge; +}>({ loading: false, knowledgeDetails: {} as IKnowledge }); const initialEntityTypes = [ 'organization', @@ -102,7 +106,8 @@ export default function DatasetSettings() { }, }); const { dataSourceInfo } = useDataSourceInfo(); - const knowledgeDetails = useFetchKnowledgeConfigurationOnMount(form); + const { knowledgeDetails, loading: datasetSettingLoading } = + useFetchKnowledgeConfigurationOnMount(form); // const [pipelineData, setPipelineData] = useState(); const [sourceData, setSourceData] = useState(); const [graphRagGenerateData, setGraphRagGenerateData] = @@ -254,81 +259,90 @@ export default function DatasetSettings() { description={t('knowledgeConfiguration.titleDescription')} >
-
- -
- -
- {t('knowledgeConfiguration.baseInfo')} -
- + + + +
+ +
+ {t('knowledgeConfiguration.baseInfo')} +
+ - -
- {t('knowledgeConfiguration.dataPipeline')} -
- - {parseType === 1 && ( - - )} - {parseType === 2 && ( - - )} + +
+ {t('knowledgeConfiguration.dataPipeline')} +
+ + {parseType === 1 && ( + + )} + {parseType === 2 && ( + + )} - {/* */} - {parseType === 1 && } + {/* */} + {parseType === 1 && } - {/* */} - - - -
- {t('knowledgeConfiguration.globalIndex')} -
- - handleDeletePipelineTask(GenerateType.KnowledgeGraph) - } - > - - handleDeletePipelineTask(GenerateType.Raptor)} - > -
-
-
- - -
- - -
- {parseType === 1 && } -
+ + + +
+ {t('knowledgeConfiguration.globalIndex')} +
+ + handleDeletePipelineTask(GenerateType.KnowledgeGraph) + } + > + + + handleDeletePipelineTask(GenerateType.Raptor) + } + > +
+
+
+ + +
+ + +
+ {parseType === 1 && } +
+
); diff --git a/web/src/pages/home/applications.tsx b/web/src/pages/home/applications.tsx index 5686fc04f..2c3dfa682 100644 --- a/web/src/pages/home/applications.tsx +++ b/web/src/pages/home/applications.tsx @@ -10,18 +10,21 @@ import { useNavigate } from 'umi'; import { Agents } from './agent-list'; import { SeeAllAppCard } from './application-card'; import { ChatList } from './chat-list'; +import { MemoryList } from './memory-list'; import { SearchList } from './search-list'; const IconMap = { [Routes.Chats]: 'chats', [Routes.Searches]: 'searches', [Routes.Agents]: 'agents', + [Routes.Memories]: 'memory', }; const EmptyTypeMap = { [Routes.Chats]: EmptyCardType.Chat, [Routes.Searches]: EmptyCardType.Search, [Routes.Agents]: EmptyCardType.Agent, + [Routes.Memories]: EmptyCardType.Memory, }; export function Applications() { @@ -47,6 +50,7 @@ export function Applications() { { value: Routes.Chats, label: t('chat.chatApps') }, { value: Routes.Searches, label: t('search.searchApps') }, { value: Routes.Agents, label: t('header.flow') }, + { value: Routes.Memories, label: t('memories.memory') }, ], [t], ); @@ -96,6 +100,12 @@ export function Applications() { setLoading={(loading: boolean) => setLoading(loading)} > )} + {val === Routes.Memories && ( + setListLength(length)} + setLoading={(loading: boolean) => setLoading(loading)} + > + )} {listLength > 0 && ( handleNavigate({ isCreate: false })} diff --git a/web/src/pages/home/memory-list.tsx b/web/src/pages/home/memory-list.tsx new file mode 100644 index 000000000..1bc1fb059 --- /dev/null +++ b/web/src/pages/home/memory-list.tsx @@ -0,0 +1,79 @@ +import { HomeCard } from '@/components/home-card'; +import { MoreButton } from '@/components/more-button'; +import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks'; +import { useEffect } from 'react'; +import { AddOrEditModal } from '../memories/add-or-edit-modal'; +import { useFetchMemoryList, useRenameMemory } from '../memories/hooks'; +import { ICreateMemoryProps } from '../memories/interface'; +import { MemoryDropdown } from '../memories/memory-dropdown'; + +export function MemoryList({ + setListLength, + setLoading, +}: { + setListLength: (length: number) => void; + setLoading?: (loading: boolean) => void; +}) { + const { data, refetch: refetchList, isLoading } = useFetchMemoryList(); + const { navigateToMemory } = useNavigatePage(); + // const { + // openCreateModal, + // showSearchRenameModal, + // hideSearchRenameModal, + // searchRenameLoading, + // onSearchRenameOk, + // initialSearchName, + // } = useRenameSearch(); + const { + openCreateModal, + showMemoryRenameModal, + hideMemoryModal, + searchRenameLoading, + onMemoryRenameOk, + initialMemory, + } = useRenameMemory(); + const onMemoryConfirm = (data: ICreateMemoryProps) => { + onMemoryRenameOk(data, () => { + refetchList(); + }); + }; + + useEffect(() => { + setListLength(data?.data?.memory_list?.length || 0); + setLoading?.(isLoading || false); + }, [data, setListLength, isLoading, setLoading]); + return ( + <> + {data?.data.memory_list.slice(0, 10).map((x) => ( + + + + } + > + ))} + {openCreateModal && ( + + )} + + ); +}