|
@@ -4,6 +4,7 @@ import { useTranslation } from 'react-i18next'
|
|
|
import { useContext } from 'use-context-selector'
|
|
|
import { useBoolean } from 'ahooks'
|
|
|
import { XMarkIcon } from '@heroicons/react/20/solid'
|
|
|
+import { RocketLaunchIcon } from '@heroicons/react/24/outline'
|
|
|
import cn from 'classnames'
|
|
|
import Link from 'next/link'
|
|
|
import { groupBy } from 'lodash-es'
|
|
@@ -20,6 +21,7 @@ import {
|
|
|
} from '@/service/datasets'
|
|
|
import Button from '@/app/components/base/button'
|
|
|
import Loading from '@/app/components/base/loading'
|
|
|
+import FloatRightContainer from '@/app/components/base/float-right-container'
|
|
|
import RetrievalMethodConfig from '@/app/components/datasets/common/retrieval-method-config'
|
|
|
import EconomicalRetrievalMethodConfig from '@/app/components/datasets/common/economical-retrieval-method-config'
|
|
|
import { type RetrievalConfig } from '@/types/app'
|
|
@@ -37,6 +39,8 @@ import I18n from '@/context/i18n'
|
|
|
import { IS_CE_EDITION } from '@/config'
|
|
|
import { RETRIEVE_METHOD } from '@/types/app'
|
|
|
import { useProviderContext } from '@/context/provider-context'
|
|
|
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
|
|
|
+import Tooltip from '@/app/components/base/tooltip'
|
|
|
|
|
|
type ValueOf<T> = T[keyof T]
|
|
|
type StepTwoProps = {
|
|
@@ -84,6 +88,9 @@ const StepTwo = ({
|
|
|
const { t } = useTranslation()
|
|
|
const { locale } = useContext(I18n)
|
|
|
|
|
|
+ const media = useBreakpoints()
|
|
|
+ const isMobile = media === MediaType.mobile
|
|
|
+
|
|
|
const { dataset: currentDataset, mutateDatasetRes } = useDatasetDetailContext()
|
|
|
const scrollRef = useRef<HTMLDivElement>(null)
|
|
|
const [scrolled, setScrolled] = useState(false)
|
|
@@ -467,7 +474,7 @@ const StepTwo = ({
|
|
|
useEffect(() => {
|
|
|
if (segmentationType === SegmentType.AUTO) {
|
|
|
setAutomaticFileIndexingEstimate(null)
|
|
|
- setShowPreview()
|
|
|
+ !isMobile && setShowPreview()
|
|
|
fetchFileIndexingEstimate()
|
|
|
setPreviewSwitched(false)
|
|
|
}
|
|
@@ -493,8 +500,23 @@ const StepTwo = ({
|
|
|
return (
|
|
|
<div className='flex w-full h-full'>
|
|
|
<div ref={scrollRef} className='relative h-full w-full overflow-y-scroll'>
|
|
|
- <div className={cn(s.pageHeader, scrolled && s.fixed)}>{t('datasetCreation.steps.two')}</div>
|
|
|
- <div className={cn(s.form)}>
|
|
|
+ <div className={cn(s.pageHeader, scrolled && s.fixed, isMobile && '!px-6')}>
|
|
|
+ <span>{t('datasetCreation.steps.two')}</span>
|
|
|
+ {isMobile && (
|
|
|
+ <Button
|
|
|
+ className='border-[0.5px] !h-8 hover:outline hover:outline-[0.5px] hover:outline-gray-300 text-gray-700 font-medium bg-white shadow-[0px_1px_2px_0px_rgba(16,24,40,0.05)]'
|
|
|
+ onClick={setShowPreview}
|
|
|
+ >
|
|
|
+ <Tooltip selector='data-preview-toggle'>
|
|
|
+ <div className="flex flex-row items-center">
|
|
|
+ <RocketLaunchIcon className="h-4 w-4 mr-1.5 stroke-[1.8px]" />
|
|
|
+ <span className="text-[13px]">{t('datasetCreation.stepTwo.previewTitleButton')}</span>
|
|
|
+ </div>
|
|
|
+ </Tooltip>
|
|
|
+ </Button>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ <div className={cn(s.form, isMobile && '!px-4')}>
|
|
|
<div className={s.label}>{t('datasetCreation.stepTwo.segmentation')}</div>
|
|
|
<div className='max-w-[640px]'>
|
|
|
<div
|
|
@@ -554,7 +576,7 @@ const StepTwo = ({
|
|
|
</div>
|
|
|
</div>
|
|
|
<div className={s.formRow}>
|
|
|
- <div className='w-full'>
|
|
|
+ <div className='w-full flex flex-col gap-1'>
|
|
|
<div className={s.label}>{t('datasetCreation.stepTwo.rules')}</div>
|
|
|
{rules.map(rule => (
|
|
|
<div key={rule.id} className={s.ruleItem}>
|
|
@@ -574,7 +596,7 @@ const StepTwo = ({
|
|
|
</div>
|
|
|
<div className={s.label}>{t('datasetCreation.stepTwo.indexMode')}</div>
|
|
|
<div className='max-w-[640px]'>
|
|
|
- <div className='flex items-center gap-3'>
|
|
|
+ <div className='flex items-center gap-3 flex-wrap sm:flex-nowrap'>
|
|
|
{(!hasSetIndexType || (hasSetIndexType && indexingType === IndexingType.QUALIFIED)) && (
|
|
|
<div
|
|
|
className={cn(
|
|
@@ -797,68 +819,69 @@ const StepTwo = ({
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- {(showPreview)
|
|
|
- ? (
|
|
|
- <div ref={previewScrollRef} className={cn(s.previewWrap, 'relativeh-full overflow-y-scroll border-l border-[#F2F4F7]')}>
|
|
|
- <div className={cn(s.previewHeader, previewScrolled && `${s.fixed} pb-3`)}>
|
|
|
- <div className='flex items-center justify-between px-8'>
|
|
|
- <div className='grow flex items-center'>
|
|
|
- <div>{t('datasetCreation.stepTwo.previewTitle')}</div>
|
|
|
- {docForm === DocForm.QA && !previewSwitched && (
|
|
|
- <Button className='ml-2 !h-[26px] !py-[3px] !px-2 !text-xs !font-medium !text-primary-600' onClick={previewSwitch}>{t('datasetCreation.stepTwo.previewButton')}</Button>
|
|
|
- )}
|
|
|
- </div>
|
|
|
- <div className='flex items-center justify-center w-6 h-6 cursor-pointer' onClick={hidePreview}>
|
|
|
- <XMarkIcon className='h-4 w-4'></XMarkIcon>
|
|
|
- </div>
|
|
|
+ <FloatRightContainer isMobile={isMobile} isOpen={showPreview} onClose={hidePreview} footer={null}>
|
|
|
+ {showPreview && <div ref={previewScrollRef} className={cn(s.previewWrap, 'relative h-full overflow-y-scroll border-l border-[#F2F4F7]')}>
|
|
|
+ <div className={cn(s.previewHeader, previewScrolled && `${s.fixed} pb-3`)}>
|
|
|
+ <div className='flex items-center justify-between px-8'>
|
|
|
+ <div className='grow flex items-center'>
|
|
|
+ <div>{t('datasetCreation.stepTwo.previewTitle')}</div>
|
|
|
+ {docForm === DocForm.QA && !previewSwitched && (
|
|
|
+ <Button className='ml-2 !h-[26px] !py-[3px] !px-2 !text-xs !font-medium !text-primary-600' onClick={previewSwitch}>{t('datasetCreation.stepTwo.previewButton')}</Button>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ <div className='flex items-center justify-center w-6 h-6 cursor-pointer' onClick={hidePreview}>
|
|
|
+ <XMarkIcon className='h-4 w-4'></XMarkIcon>
|
|
|
</div>
|
|
|
- {docForm === DocForm.QA && !previewSwitched && (
|
|
|
- <div className='px-8 pr-12 text-xs text-gray-500'>
|
|
|
- <span>{t('datasetCreation.stepTwo.previewSwitchTipStart')}</span>
|
|
|
- <span className='text-amber-600'>{t('datasetCreation.stepTwo.previewSwitchTipEnd')}</span>
|
|
|
- </div>
|
|
|
- )}
|
|
|
- </div>
|
|
|
- <div className='my-4 px-8 space-y-4'>
|
|
|
- {previewSwitched && docForm === DocForm.QA && fileIndexingEstimate?.qa_preview && (
|
|
|
- <>
|
|
|
- {fileIndexingEstimate?.qa_preview.map((item, index) => (
|
|
|
- <PreviewItem type={PreviewType.QA} key={item.question} qa={item} index={index + 1} />
|
|
|
- ))}
|
|
|
- </>
|
|
|
- )}
|
|
|
- {(docForm === DocForm.TEXT || !previewSwitched) && fileIndexingEstimate?.preview && (
|
|
|
- <>
|
|
|
- {fileIndexingEstimate?.preview.map((item, index) => (
|
|
|
- <PreviewItem type={PreviewType.TEXT} key={item} content={item} index={index + 1} />
|
|
|
- ))}
|
|
|
- </>
|
|
|
- )}
|
|
|
- {previewSwitched && docForm === DocForm.QA && !fileIndexingEstimate?.qa_preview && (
|
|
|
- <div className='flex items-center justify-center h-[200px]'>
|
|
|
- <Loading type='area' />
|
|
|
- </div>
|
|
|
- )}
|
|
|
- {!previewSwitched && !fileIndexingEstimate?.preview && (
|
|
|
- <div className='flex items-center justify-center h-[200px]'>
|
|
|
- <Loading type='area' />
|
|
|
- </div>
|
|
|
- )}
|
|
|
</div>
|
|
|
+ {docForm === DocForm.QA && !previewSwitched && (
|
|
|
+ <div className='px-8 pr-12 text-xs text-gray-500'>
|
|
|
+ <span>{t('datasetCreation.stepTwo.previewSwitchTipStart')}</span>
|
|
|
+ <span className='text-amber-600'>{t('datasetCreation.stepTwo.previewSwitchTipEnd')}</span>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ <div className='my-4 px-8 space-y-4'>
|
|
|
+ {previewSwitched && docForm === DocForm.QA && fileIndexingEstimate?.qa_preview && (
|
|
|
+ <>
|
|
|
+ {fileIndexingEstimate?.qa_preview.map((item, index) => (
|
|
|
+ <PreviewItem type={PreviewType.QA} key={item.question} qa={item} index={index + 1} />
|
|
|
+ ))}
|
|
|
+ </>
|
|
|
+ )}
|
|
|
+ {(docForm === DocForm.TEXT || !previewSwitched) && fileIndexingEstimate?.preview && (
|
|
|
+ <>
|
|
|
+ {fileIndexingEstimate?.preview.map((item, index) => (
|
|
|
+ <PreviewItem type={PreviewType.TEXT} key={item} content={item} index={index + 1} />
|
|
|
+ ))}
|
|
|
+ </>
|
|
|
+ )}
|
|
|
+ {previewSwitched && docForm === DocForm.QA && !fileIndexingEstimate?.qa_preview && (
|
|
|
+ <div className='flex items-center justify-center h-[200px]'>
|
|
|
+ <Loading type='area' />
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ {!previewSwitched && !fileIndexingEstimate?.preview && (
|
|
|
+ <div className='flex items-center justify-center h-[200px]'>
|
|
|
+ <Loading type='area' />
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
</div>
|
|
|
- )
|
|
|
- : (<div className={cn(s.sideTip)}>
|
|
|
- <div className={s.tipCard}>
|
|
|
- <span className={s.icon} />
|
|
|
- <div className={s.title}>{t('datasetCreation.stepTwo.sideTipTitle')}</div>
|
|
|
- <div className={s.content}>
|
|
|
- <p className='mb-3'>{t('datasetCreation.stepTwo.sideTipP1')}</p>
|
|
|
- <p className='mb-3'>{t('datasetCreation.stepTwo.sideTipP2')}</p>
|
|
|
- <p className='mb-3'>{t('datasetCreation.stepTwo.sideTipP3')}</p>
|
|
|
- <p>{t('datasetCreation.stepTwo.sideTipP4')}</p>
|
|
|
+ </div>}
|
|
|
+ {!showPreview && (
|
|
|
+ <div className={cn(s.sideTip)}>
|
|
|
+ <div className={s.tipCard}>
|
|
|
+ <span className={s.icon} />
|
|
|
+ <div className={s.title}>{t('datasetCreation.stepTwo.sideTipTitle')}</div>
|
|
|
+ <div className={s.content}>
|
|
|
+ <p className='mb-3'>{t('datasetCreation.stepTwo.sideTipP1')}</p>
|
|
|
+ <p className='mb-3'>{t('datasetCreation.stepTwo.sideTipP2')}</p>
|
|
|
+ <p className='mb-3'>{t('datasetCreation.stepTwo.sideTipP3')}</p>
|
|
|
+ <p>{t('datasetCreation.stepTwo.sideTipP4')}</p>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>)}
|
|
|
+ )}
|
|
|
+ </FloatRightContainer>
|
|
|
</div>
|
|
|
)
|
|
|
}
|