diff --git a/web/src/hooks/logic-hooks/navigate-hooks.ts b/web/src/hooks/logic-hooks/navigate-hooks.ts index 1df861364d..a4cb25bd1d 100644 --- a/web/src/hooks/logic-hooks/navigate-hooks.ts +++ b/web/src/hooks/logic-hooks/navigate-hooks.ts @@ -209,7 +209,11 @@ export const useNavigatePage = () => { const params: string[] = []; Object.keys(props).forEach((key) => { if (props[key as keyof typeof props]) { - params.push(`${key}=${props[key as keyof typeof props]}`); + // Values may contain characters like `&`, `=` or `#` (e.g. file + // names), which would corrupt the query string without encoding. + params.push( + `${key}=${encodeURIComponent(props[key as keyof typeof props] as string)}`, + ); } }); navigate( diff --git a/web/src/pages/agent/pipeline-log-sheet/index.tsx b/web/src/pages/agent/pipeline-log-sheet/index.tsx index 959a9d1299..1da82eafff 100644 --- a/web/src/pages/agent/pipeline-log-sheet/index.tsx +++ b/web/src/pages/agent/pipeline-log-sheet/index.tsx @@ -75,6 +75,12 @@ export function PipelineLogSheet({ uploadedFileData?.created_by, [PipelineResultSearchParams.DocumentExtension]: uploadedFileData?.extension, + [PipelineResultSearchParams.DocumentName]: + uploadedFileData?.name, + [PipelineResultSearchParams.DocumentSize]: + uploadedFileData?.size, + [PipelineResultSearchParams.DocumentCreatedAt]: + uploadedFileData?.created_at, })} > {t('flow.viewResult')} diff --git a/web/src/pages/dataflow-result/constant.ts b/web/src/pages/dataflow-result/constant.ts index 1033a47506..bdaaf339d4 100644 --- a/web/src/pages/dataflow-result/constant.ts +++ b/web/src/pages/dataflow-result/constant.ts @@ -23,4 +23,7 @@ export enum PipelineResultSearchParams { AgentTitle = 'agent_title', CreatedBy = 'created_by', // Who uploaded the file DocumentExtension = 'extension', + DocumentName = 'doc_name', + DocumentSize = 'doc_size', + DocumentCreatedAt = 'doc_created_at', } diff --git a/web/src/pages/dataflow-result/hooks.ts b/web/src/pages/dataflow-result/hooks.ts index 02c16aab3b..1f4fee6423 100644 --- a/web/src/pages/dataflow-result/hooks.ts +++ b/web/src/pages/dataflow-result/hooks.ts @@ -289,7 +289,6 @@ export const useGetPipelineResultSearchParams = () => { const is_read_only = currentQueryParameters.get( PipelineResultSearchParams.IsReadOnly, ) as 'true' | 'false'; - console.log('is_read_only', is_read_only); return { type: currentQueryParameters.get(PipelineResultSearchParams.Type) || '', documentId: @@ -307,6 +306,14 @@ export const useGetPipelineResultSearchParams = () => { ) || '', createdBy: currentQueryParameters.get(PipelineResultSearchParams.CreatedBy) || '', + documentName: + currentQueryParameters.get(PipelineResultSearchParams.DocumentName) || '', + documentSize: + currentQueryParameters.get(PipelineResultSearchParams.DocumentSize) || '', + documentCreatedAt: + currentQueryParameters.get( + PipelineResultSearchParams.DocumentCreatedAt, + ) || '', }; }; diff --git a/web/src/pages/dataflow-result/index.tsx b/web/src/pages/dataflow-result/index.tsx index f3ed49cc03..1f8fd9eee0 100644 --- a/web/src/pages/dataflow-result/index.tsx +++ b/web/src/pages/dataflow-result/index.tsx @@ -24,6 +24,7 @@ import { Modal } from '@/components/ui/modal/modal'; import { AgentCategory, AgentQuery } from '@/constants/agent'; import { Images } from '@/constants/common'; import { useGetKnowledgeSearchParams } from '@/hooks/route-hook'; +import { IKnowledgeFile } from '@/interfaces/database/dataset'; import { Routes } from '@/routes'; import { LucideArrowBigLeft } from 'lucide-react'; import TimelineDataFlow from './components/time-line'; @@ -33,17 +34,45 @@ import { IDslComponent, IPipelineFileLogDetail } from './interface'; import ParserContainer from './parser'; const DataflowResult = () => { - const { isReadOnly, knowledgeId, agentId, documentExtension } = - useGetPipelineResultSearchParams(); + const { + isReadOnly, + knowledgeId, + agentId, + documentExtension, + documentName, + documentSize, + documentCreatedAt, + } = useGetPipelineResultSearchParams(); const isAgent = !!agentId; const { pipelineResult } = useFetchPipelineResult({ agentId }); const { - data: { documentInfo }, + data: { documentInfo: chunkDocumentInfo }, } = useFetchNextChunkList(!isAgent); + // In agent mode the chunk list query is disabled, so the document info + // comes from the search params passed by the pipeline log sheet instead. + const documentInfo = useMemo(() => { + if (!isAgent) { + return chunkDocumentInfo; + } + return { + name: documentName, + size: Number(documentSize) || 0, + create_date: documentCreatedAt + ? new Date(Number(documentCreatedAt) * 1000).toISOString() + : '', + } as IKnowledgeFile; + }, [ + chunkDocumentInfo, + documentCreatedAt, + documentName, + documentSize, + isAgent, + ]); + const { selectedChunk, handleChunkCardClick } = useHandleChunkCardClick(); const [activeStepId, setActiveStepId] = useState(2); const { data: dataset } = useFetchPipelineFileLogDetail({ diff --git a/web/src/pages/dataflow-result/interface.ts b/web/src/pages/dataflow-result/interface.ts index 0772b4ceaf..4cdee07e6e 100644 --- a/web/src/pages/dataflow-result/interface.ts +++ b/web/src/pages/dataflow-result/interface.ts @@ -150,4 +150,7 @@ export interface NavigateToDataflowResultProps { [PipelineResultSearchParams.Type]: string; [PipelineResultSearchParams.CreatedBy]?: string; [PipelineResultSearchParams.DocumentExtension]?: string; + [PipelineResultSearchParams.DocumentName]?: string; + [PipelineResultSearchParams.DocumentSize]?: string | number; + [PipelineResultSearchParams.DocumentCreatedAt]?: string | number; }