diff --git a/web/app/components/datasets/documents/create-from-pipeline/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/index.tsx index f5e498b278..fc19058cca 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/index.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/index.tsx @@ -1,7 +1,7 @@ 'use client' import { useCallback, useMemo, useRef, useState } from 'react' import DataSourceOptions from './data-source-options' -import type { CrawlResultItem, CustomFile as File, FileIndexingEstimateResponse, FileItem } from '@/models/datasets' +import type { CrawlResultItem, DocumentItem, CustomFile as File, FileIndexingEstimateResponse, FileItem } from '@/models/datasets' import LocalFile from '@/app/components/rag-pipeline/components/panel/test-run/data-source/local-file' import produce from 'immer' import { useProviderContextSelector } from '@/context/provider-context' @@ -48,6 +48,9 @@ const TestRunPanel = () => { const isPreview = useRef(false) const formRef = useRef(null) + const previewFile = useRef(fileList[0].file as DocumentItem) + const previewNotionPage = useRef(notionPages[0]) + const previewWebsitePage = useRef(websitePages[0]) const { data: pipelineInfo, isFetching: isFetchingPipelineInfo } = usePublishedPipelineInfo(pipelineId || '') @@ -132,7 +135,7 @@ const TestRunPanel = () => { return const datasourceInfoList: Record[] = [] if (datasource.type === DatasourceType.localFile) { - const { id, name, type, size, extension, mime_type } = fileList[0].file + const { id, name, type, size, extension, mime_type } = previewFile.current as File const documentInfo = { upload_file_id: id, name, @@ -144,7 +147,7 @@ const TestRunPanel = () => { datasourceInfoList.push(documentInfo) } if (datasource.type === DatasourceType.onlineDocument) { - const { workspace_id, ...rest } = notionPages[0] + const { workspace_id, ...rest } = previewNotionPage.current const documentInfo = { workspace_id, page: rest, @@ -154,7 +157,7 @@ const TestRunPanel = () => { if (datasource.type === DatasourceType.websiteCrawl) { const documentInfo = { job_id: websiteCrawlJobId, - result: websitePages[0], + result: previewWebsitePage.current, } datasourceInfoList.push(documentInfo) } @@ -167,10 +170,10 @@ const TestRunPanel = () => { is_preview: true, }, { onSuccess: (res) => { - setEstimateData(res as FileIndexingEstimateResponse) + setEstimateData(res.data.outputs as FileIndexingEstimateResponse) }, }) - }, [datasource, fileList, notionPages, pipelineId, runPublishedPipeline, websiteCrawlJobId, websitePages]) + }, [datasource, pipelineId, runPublishedPipeline, websiteCrawlJobId]) const handleProcess = useCallback(async (data: Record) => { if (!datasource) @@ -231,14 +234,25 @@ const TestRunPanel = () => { formRef.current?.submit() }, []) - const onClickReset = useCallback(() => { - formRef.current?.reset() - }, []) - const handleSubmit = useCallback((data: Record) => { isPreview.current ? handlePreviewChunks(data) : handleProcess(data) }, [handlePreviewChunks, handleProcess]) + const handlePreviewFileChange = useCallback((file: DocumentItem) => { + previewFile.current = file + onClickPreview() + }, [onClickPreview]) + + const handlePreviewNotionPageChange = useCallback((page: NotionPage) => { + previewNotionPage.current = page + onClickPreview() + }, [onClickPreview]) + + const handlePreviewWebsiteChange = useCallback((website: CrawlResultItem) => { + previewWebsitePage.current = website + onClickPreview() + }, [onClickPreview]) + if (isFetchingPipelineInfo) { return ( @@ -312,7 +326,6 @@ const TestRunPanel = () => { onProcess={onClickProcess} onPreview={onClickPreview} onSubmit={handleSubmit} - onReset={onClickReset} onBack={handleBackStep} /> ) @@ -353,6 +366,9 @@ const TestRunPanel = () => { isPending={isPending} estimateData={estimateData} onPreview={onClickPreview} + handlePreviewFileChange={handlePreviewFileChange} + handlePreviewNotionPageChange={handlePreviewNotionPageChange} + handlePreviewWebsitePageChange={handlePreviewWebsiteChange} /> )} diff --git a/web/app/components/datasets/documents/create-from-pipeline/preview/chunk-preview.tsx b/web/app/components/datasets/documents/create-from-pipeline/preview/chunk-preview.tsx index 96ff4b4ccb..61779bd57b 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/preview/chunk-preview.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/preview/chunk-preview.tsx @@ -26,6 +26,9 @@ type ChunkPreviewProps = { isPending: boolean estimateData: FileIndexingEstimateResponse | undefined onPreview: () => void + handlePreviewFileChange: (file: DocumentItem) => void + handlePreviewNotionPageChange: (page: NotionPage) => void + handlePreviewWebsitePageChange: (page: CrawlResultItem) => void } const ChunkPreview = ({ @@ -37,6 +40,9 @@ const ChunkPreview = ({ isPending, estimateData, onPreview, + handlePreviewFileChange, + handlePreviewNotionPageChange, + handlePreviewWebsitePageChange, }: ChunkPreviewProps) => { const { t } = useTranslation() const currentDocForm = useDatasetDetailContextWithSelector(s => s.dataset?.doc_form) @@ -58,6 +64,7 @@ const ChunkPreview = ({ files={files as Array>} onChange={(selected) => { setPreviewFile(selected) + handlePreviewFileChange(selected) }} value={previewFile} /> @@ -74,6 +81,7 @@ const ChunkPreview = ({ onChange={(selected) => { const selectedPage = notionPages.find(page => page.page_id === selected.id) setPreviewNotionPage(selectedPage!) + handlePreviewNotionPageChange(selectedPage!) }} value={{ id: previewNotionPage?.page_id || '', @@ -94,6 +102,7 @@ const ChunkPreview = ({ onChange={(selected) => { const selectedPage = websitePages.find(page => page.source_url === selected.id) setPreviewWebsitePage(selectedPage!) + handlePreviewWebsitePageChange(selectedPage!) }} value={ { @@ -113,7 +122,7 @@ const ChunkPreview = ({ } } - className='relative flex h-full w-1/2 shrink-0 p-4 pr-0' + className='relative flex h-full w-full shrink-0' mainClassName='space-y-6' > {currentDocForm === ChunkingMode.qa && estimateData?.qa_preview && ( @@ -169,7 +178,7 @@ const ChunkPreview = ({ ) }) )} - {!isIdle && ( + {isIdle && (
diff --git a/web/app/components/datasets/documents/create-from-pipeline/process-documents/options.tsx b/web/app/components/datasets/documents/create-from-pipeline/process-documents/form.tsx similarity index 75% rename from web/app/components/datasets/documents/create-from-pipeline/process-documents/options.tsx rename to web/app/components/datasets/documents/create-from-pipeline/process-documents/form.tsx index d4400dff77..b427a03dca 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/process-documents/options.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/process-documents/form.tsx @@ -2,22 +2,25 @@ import { useAppForm } from '@/app/components/base/form' import BaseField from '@/app/components/base/form/form-scenarios/base/field' import type { BaseConfiguration } from '@/app/components/base/form/form-scenarios/base/types' import Toast from '@/app/components/base/toast' -import { useImperativeHandle } from 'react' +import { useCallback, useImperativeHandle } from 'react' import type { ZodSchema } from 'zod' +import Header from './header' type OptionsProps = { initialData: Record configurations: BaseConfiguration[] schema: ZodSchema onSubmit: (data: Record) => void + onPreview: () => void ref: React.RefObject } -const Options = ({ +const Form = ({ initialData, configurations, schema, onSubmit, + onPreview, ref, }: OptionsProps) => { const form = useAppForm({ @@ -48,24 +51,32 @@ const Options = ({ submit: () => { form.handleSubmit() }, - reset: () => { - form.reset() - }, - isDirty: () => { - return form.state.isDirty - }, } }, [form]) + const handleReset = useCallback(() => { + form.reset() + }, [form]) + return (
{ e.preventDefault() e.stopPropagation() form.handleSubmit() }} > + state.isDirty} + children={isDirty => ( +
+ )} + />
{configurations.map((config, index) => { const FieldComponent = BaseField({ @@ -79,4 +90,4 @@ const Options = ({ ) } -export default Options +export default Form diff --git a/web/app/components/datasets/documents/create-from-pipeline/process-documents/header.tsx b/web/app/components/datasets/documents/create-from-pipeline/process-documents/header.tsx index f7d019b579..1ca9840a6a 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/process-documents/header.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/process-documents/header.tsx @@ -5,13 +5,13 @@ import { RiSearchEyeLine } from '@remixicon/react' type HeaderProps = { onReset: () => void - disableReset?: boolean + resetDisabled: boolean onPreview?: () => void } const Header = ({ onReset, - disableReset = true, + resetDisabled, onPreview, }: HeaderProps) => { const { t } = useTranslation() @@ -21,7 +21,7 @@ const Header = ({
{t('datasetPipeline.addDocuments.stepTwo.chunkSettings')}
-