refactor: streamline data source type handling and improve FieldList props

This commit is contained in:
twwu 2025-05-28 10:07:12 +08:00
parent b320ebe2ba
commit dd0cf6fadc
3 changed files with 21 additions and 17 deletions

View File

@ -1,12 +1,11 @@
import React, { useMemo, useState } from 'react' import React, { useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { PreviewContainer } from '../../../preview/container' import { PreviewContainer } from '../../../preview/container'
import { PreviewHeader } from '../../../preview/header' import { PreviewHeader } from '../../../preview/header'
import type { Datasource } from '@/app/components/rag-pipeline/components/panel/test-run/types' import type { Datasource } from '@/app/components/rag-pipeline/components/panel/test-run/types'
import type { CrawlResultItem, CustomFile, DocumentItem, FileIndexingEstimateResponse } from '@/models/datasets' import type { CrawlResultItem, CustomFile, DocumentItem, FileIndexingEstimateResponse } from '@/models/datasets'
import { ChunkingMode, DataSourceType } from '@/models/datasets' import { ChunkingMode } from '@/models/datasets'
import type { NotionPage } from '@/models/common' import type { NotionPage } from '@/models/common'
import { DataSourceProvider } from '@/models/common'
import PreviewDocumentPicker from '../../../common/document-picker/preview-document-picker' import PreviewDocumentPicker from '../../../common/document-picker/preview-document-picker'
import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail' import { useDatasetDetailContextWithSelector } from '@/context/dataset-detail'
import { ChunkContainer, QAPreview } from '../../../chunk' import { ChunkContainer, QAPreview } from '../../../chunk'
@ -16,6 +15,7 @@ import { SkeletonContainer, SkeletonPoint, SkeletonRectangle, SkeletonRow } from
import { RiSearchEyeLine } from '@remixicon/react' import { RiSearchEyeLine } from '@remixicon/react'
import Badge from '@/app/components/base/badge' import Badge from '@/app/components/base/badge'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import { DatasourceType } from '@/models/pipeline'
type ChunkPreviewProps = { type ChunkPreviewProps = {
datasource: Datasource datasource: Datasource
@ -45,12 +45,7 @@ const ChunkPreview = ({
const [previewNotionPage, setPreviewNotionPage] = useState<NotionPage>(notionPages[0]) const [previewNotionPage, setPreviewNotionPage] = useState<NotionPage>(notionPages[0])
const [previewWebsitePage, setPreviewWebsitePage] = useState<CrawlResultItem>(websitePages[0]) const [previewWebsitePage, setPreviewWebsitePage] = useState<CrawlResultItem>(websitePages[0])
const dataSourceType = useMemo(() => { const dataSourceType = datasource?.type
const type = datasource.type
if (type === DataSourceProvider.fireCrawl || type === DataSourceProvider.jinaReader || type === DataSourceProvider.waterCrawl)
return DataSourceType.WEB
return type
}, [datasource.type])
return ( return (
<PreviewContainer <PreviewContainer
@ -58,7 +53,7 @@ const ChunkPreview = ({
title={t('datasetCreation.stepTwo.preview')} title={t('datasetCreation.stepTwo.preview')}
> >
<div className='flex items-center gap-1'> <div className='flex items-center gap-1'>
{dataSourceType === DataSourceType.FILE {dataSourceType === DatasourceType.localFile
&& <PreviewDocumentPicker && <PreviewDocumentPicker
files={files as Array<Required<CustomFile>>} files={files as Array<Required<CustomFile>>}
onChange={(selected) => { onChange={(selected) => {
@ -67,7 +62,7 @@ const ChunkPreview = ({
value={previewFile} value={previewFile}
/> />
} }
{dataSourceType === DataSourceType.NOTION {dataSourceType === DatasourceType.onlineDocument
&& <PreviewDocumentPicker && <PreviewDocumentPicker
files={ files={
notionPages.map(page => ({ notionPages.map(page => ({
@ -87,7 +82,7 @@ const ChunkPreview = ({
}} }}
/> />
} }
{dataSourceType === DataSourceType.WEB {dataSourceType === DatasourceType.websiteCrawl
&& <PreviewDocumentPicker && <PreviewDocumentPicker
files={ files={
websitePages.map(page => ({ websitePages.map(page => ({

View File

@ -1,3 +1,4 @@
import React, { useCallback } from 'react'
import { RiAddLine } from '@remixicon/react' import { RiAddLine } from '@remixicon/react'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
import InputFieldEditor from '../editor' import InputFieldEditor from '../editor'
@ -7,20 +8,26 @@ import { useFieldList } from './hooks'
import FieldListContainer from './field-list-container' import FieldListContainer from './field-list-container'
type FieldListProps = { type FieldListProps = {
nodeId: string
LabelRightContent: React.ReactNode LabelRightContent: React.ReactNode
inputFields: InputVar[] inputFields: InputVar[]
handleInputFieldsChange: (value: InputVar[]) => void handleInputFieldsChange: (key: string, value: InputVar[]) => void
readonly?: boolean readonly?: boolean
labelClassName?: string labelClassName?: string
} }
const FieldList = ({ const FieldList = ({
nodeId,
LabelRightContent, LabelRightContent,
inputFields: initialInputFields, inputFields: initialInputFields,
handleInputFieldsChange: onInputFieldsChange, handleInputFieldsChange,
readonly, readonly,
labelClassName, labelClassName,
}: FieldListProps) => { }: FieldListProps) => {
const onInputFieldsChange = useCallback((value: InputVar[]) => {
handleInputFieldsChange(nodeId, value)
}, [handleInputFieldsChange, nodeId])
const { const {
inputFields, inputFields,
handleSubmitField, handleSubmitField,
@ -67,4 +74,4 @@ const FieldList = ({
) )
} }
export default FieldList export default React.memo(FieldList)

View File

@ -107,22 +107,24 @@ const InputFieldDialog = ({
return ( return (
<FieldList <FieldList
key={key} key={key}
nodeId={key}
LabelRightContent={<Datasource nodeData={datasourceNodeDataMap[key]} />} LabelRightContent={<Datasource nodeData={datasourceNodeDataMap[key]} />}
inputFields={inputFields} inputFields={inputFields}
readonly={readonly} readonly={readonly}
labelClassName='pt-2 pb-1' labelClassName='pt-2 pb-1'
handleInputFieldsChange={updateInputFields.bind(null, key)} handleInputFieldsChange={updateInputFields}
/> />
) )
}) })
} }
{/* Shared Inputs */} {/* Shared Inputs */}
<FieldList <FieldList
nodeId='shared'
LabelRightContent={<SharedInputs />} LabelRightContent={<SharedInputs />}
inputFields={inputFieldsMap.shared || []} inputFields={inputFieldsMap.shared || []}
readonly={readonly} readonly={readonly}
labelClassName='pt-1 pb-2' labelClassName='pt-1 pb-2'
handleInputFieldsChange={updateInputFields.bind(null, 'shared')} handleInputFieldsChange={updateInputFields}
/> />
</div> </div>
<FooterTip /> <FooterTip />