| @@ -132,189 +132,191 @@ const StepOne = ({ | |||
| }, [files, isShowVectorSpaceFull]) | |||
| return ( | |||
| <div className='flex w-full h-full'> | |||
| <div className='w-1/2 h-full overflow-y-auto relative'> | |||
| <div className='flex justify-end'> | |||
| <div className={classNames(s.form)}> | |||
| { | |||
| shouldShowDataSourceTypeList && ( | |||
| <div className={classNames(s.stepHeader, 'text-text-secondary system-md-semibold')}> | |||
| {t('datasetCreation.steps.one')} | |||
| </div> | |||
| ) | |||
| } | |||
| { | |||
| shouldShowDataSourceTypeList && ( | |||
| <div className='grid grid-cols-3 mb-8 gap-4'> | |||
| <div | |||
| className={cn( | |||
| s.dataSourceItem, | |||
| 'system-sm-medium', | |||
| dataSourceType === DataSourceType.FILE && s.active, | |||
| dataSourceTypeDisable && dataSourceType !== DataSourceType.FILE && s.disabled, | |||
| )} | |||
| onClick={() => { | |||
| if (dataSourceTypeDisable) | |||
| return | |||
| changeType(DataSourceType.FILE) | |||
| hideFilePreview() | |||
| hideNotionPagePreview() | |||
| }} | |||
| > | |||
| <span className={cn(s.datasetIcon)} /> | |||
| <span | |||
| title={t('datasetCreation.stepOne.dataSourceType.file')} | |||
| className='truncate' | |||
| > | |||
| {t('datasetCreation.stepOne.dataSourceType.file')} | |||
| </span> | |||
| <div className='w-full h-full overflow-x-auto'> | |||
| <div className='flex w-full h-full min-w-[1440px]'> | |||
| <div className='w-1/2 h-full overflow-y-auto relative'> | |||
| <div className='flex justify-end'> | |||
| <div className={classNames(s.form)}> | |||
| { | |||
| shouldShowDataSourceTypeList && ( | |||
| <div className={classNames(s.stepHeader, 'text-text-secondary system-md-semibold')}> | |||
| {t('datasetCreation.steps.one')} | |||
| </div> | |||
| <div | |||
| className={cn( | |||
| s.dataSourceItem, | |||
| 'system-sm-medium', | |||
| dataSourceType === DataSourceType.NOTION && s.active, | |||
| dataSourceTypeDisable && dataSourceType !== DataSourceType.NOTION && s.disabled, | |||
| )} | |||
| onClick={() => { | |||
| if (dataSourceTypeDisable) | |||
| return | |||
| changeType(DataSourceType.NOTION) | |||
| hideFilePreview() | |||
| hideNotionPagePreview() | |||
| }} | |||
| > | |||
| <span className={cn(s.datasetIcon, s.notion)} /> | |||
| <span | |||
| title={t('datasetCreation.stepOne.dataSourceType.notion')} | |||
| className='truncate' | |||
| ) | |||
| } | |||
| { | |||
| shouldShowDataSourceTypeList && ( | |||
| <div className='grid grid-cols-3 mb-8 gap-4'> | |||
| <div | |||
| className={cn( | |||
| s.dataSourceItem, | |||
| 'system-sm-medium', | |||
| dataSourceType === DataSourceType.FILE && s.active, | |||
| dataSourceTypeDisable && dataSourceType !== DataSourceType.FILE && s.disabled, | |||
| )} | |||
| onClick={() => { | |||
| if (dataSourceTypeDisable) | |||
| return | |||
| changeType(DataSourceType.FILE) | |||
| hideFilePreview() | |||
| hideNotionPagePreview() | |||
| }} | |||
| > | |||
| {t('datasetCreation.stepOne.dataSourceType.notion')} | |||
| </span> | |||
| </div> | |||
| <div | |||
| className={cn( | |||
| s.dataSourceItem, | |||
| 'system-sm-medium', | |||
| dataSourceType === DataSourceType.WEB && s.active, | |||
| dataSourceTypeDisable && dataSourceType !== DataSourceType.WEB && s.disabled, | |||
| )} | |||
| onClick={() => changeType(DataSourceType.WEB)} | |||
| > | |||
| <span className={cn(s.datasetIcon, s.web)} /> | |||
| <span | |||
| title={t('datasetCreation.stepOne.dataSourceType.web')} | |||
| className='truncate' | |||
| <span className={cn(s.datasetIcon)} /> | |||
| <span | |||
| title={t('datasetCreation.stepOne.dataSourceType.file')} | |||
| className='truncate' | |||
| > | |||
| {t('datasetCreation.stepOne.dataSourceType.file')} | |||
| </span> | |||
| </div> | |||
| <div | |||
| className={cn( | |||
| s.dataSourceItem, | |||
| 'system-sm-medium', | |||
| dataSourceType === DataSourceType.NOTION && s.active, | |||
| dataSourceTypeDisable && dataSourceType !== DataSourceType.NOTION && s.disabled, | |||
| )} | |||
| onClick={() => { | |||
| if (dataSourceTypeDisable) | |||
| return | |||
| changeType(DataSourceType.NOTION) | |||
| hideFilePreview() | |||
| hideNotionPagePreview() | |||
| }} | |||
| > | |||
| {t('datasetCreation.stepOne.dataSourceType.web')} | |||
| </span> | |||
| </div> | |||
| </div> | |||
| ) | |||
| } | |||
| {dataSourceType === DataSourceType.FILE && ( | |||
| <> | |||
| <FileUploader | |||
| fileList={files} | |||
| titleClassName={!shouldShowDataSourceTypeList ? 'mt-[30px] !mb-[44px] !text-lg' : undefined} | |||
| prepareFileList={updateFileList} | |||
| onFileListUpdate={updateFileList} | |||
| onFileUpdate={updateFile} | |||
| onPreview={updateCurrentFile} | |||
| notSupportBatchUpload={notSupportBatchUpload} | |||
| /> | |||
| {isShowVectorSpaceFull && ( | |||
| <div className='max-w-[640px] mb-4'> | |||
| <VectorSpaceFull /> | |||
| <span className={cn(s.datasetIcon, s.notion)} /> | |||
| <span | |||
| title={t('datasetCreation.stepOne.dataSourceType.notion')} | |||
| className='truncate' | |||
| > | |||
| {t('datasetCreation.stepOne.dataSourceType.notion')} | |||
| </span> | |||
| </div> | |||
| <div | |||
| className={cn( | |||
| s.dataSourceItem, | |||
| 'system-sm-medium', | |||
| dataSourceType === DataSourceType.WEB && s.active, | |||
| dataSourceTypeDisable && dataSourceType !== DataSourceType.WEB && s.disabled, | |||
| )} | |||
| onClick={() => changeType(DataSourceType.WEB)} | |||
| > | |||
| <span className={cn(s.datasetIcon, s.web)} /> | |||
| <span | |||
| title={t('datasetCreation.stepOne.dataSourceType.web')} | |||
| className='truncate' | |||
| > | |||
| {t('datasetCreation.stepOne.dataSourceType.web')} | |||
| </span> | |||
| </div> | |||
| </div> | |||
| )} | |||
| <div className="flex justify-end gap-2 max-w-[640px]"> | |||
| {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */} | |||
| <Button disabled={nextDisabled} variant='primary' onClick={onStepChange}> | |||
| <span className="flex gap-0.5 px-[10px]"> | |||
| <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span> | |||
| <RiArrowRightLine className="size-4" /> | |||
| </span> | |||
| </Button> | |||
| </div> | |||
| </> | |||
| )} | |||
| {dataSourceType === DataSourceType.NOTION && ( | |||
| <> | |||
| {!hasConnection && <NotionConnector onSetting={onSetting} />} | |||
| {hasConnection && ( | |||
| <> | |||
| <div className='mb-8 w-[640px]'> | |||
| <NotionPageSelector | |||
| value={notionPages.map(page => page.page_id)} | |||
| onSelect={updateNotionPages} | |||
| onPreview={updateCurrentPage} | |||
| /> | |||
| ) | |||
| } | |||
| {dataSourceType === DataSourceType.FILE && ( | |||
| <> | |||
| <FileUploader | |||
| fileList={files} | |||
| titleClassName={!shouldShowDataSourceTypeList ? 'mt-[30px] !mb-[44px] !text-lg' : undefined} | |||
| prepareFileList={updateFileList} | |||
| onFileListUpdate={updateFileList} | |||
| onFileUpdate={updateFile} | |||
| onPreview={updateCurrentFile} | |||
| notSupportBatchUpload={notSupportBatchUpload} | |||
| /> | |||
| {isShowVectorSpaceFull && ( | |||
| <div className='max-w-[640px] mb-4'> | |||
| <VectorSpaceFull /> | |||
| </div> | |||
| {isShowVectorSpaceFull && ( | |||
| <div className='max-w-[640px] mb-4'> | |||
| <VectorSpaceFull /> | |||
| )} | |||
| <div className="flex justify-end gap-2 max-w-[640px]"> | |||
| {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */} | |||
| <Button disabled={nextDisabled} variant='primary' onClick={onStepChange}> | |||
| <span className="flex gap-0.5 px-[10px]"> | |||
| <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span> | |||
| <RiArrowRightLine className="size-4" /> | |||
| </span> | |||
| </Button> | |||
| </div> | |||
| </> | |||
| )} | |||
| {dataSourceType === DataSourceType.NOTION && ( | |||
| <> | |||
| {!hasConnection && <NotionConnector onSetting={onSetting} />} | |||
| {hasConnection && ( | |||
| <> | |||
| <div className='mb-8 w-[640px]'> | |||
| <NotionPageSelector | |||
| value={notionPages.map(page => page.page_id)} | |||
| onSelect={updateNotionPages} | |||
| onPreview={updateCurrentPage} | |||
| /> | |||
| </div> | |||
| )} | |||
| <div className="flex justify-end gap-2 max-w-[640px]"> | |||
| {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */} | |||
| <Button disabled={isShowVectorSpaceFull || !notionPages.length} variant='primary' onClick={onStepChange}> | |||
| <span className="flex gap-0.5 px-[10px]"> | |||
| <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span> | |||
| <RiArrowRightLine className="size-4" /> | |||
| </span> | |||
| </Button> | |||
| {isShowVectorSpaceFull && ( | |||
| <div className='max-w-[640px] mb-4'> | |||
| <VectorSpaceFull /> | |||
| </div> | |||
| )} | |||
| <div className="flex justify-end gap-2 max-w-[640px]"> | |||
| {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */} | |||
| <Button disabled={isShowVectorSpaceFull || !notionPages.length} variant='primary' onClick={onStepChange}> | |||
| <span className="flex gap-0.5 px-[10px]"> | |||
| <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span> | |||
| <RiArrowRightLine className="size-4" /> | |||
| </span> | |||
| </Button> | |||
| </div> | |||
| </> | |||
| )} | |||
| </> | |||
| )} | |||
| {dataSourceType === DataSourceType.WEB && ( | |||
| <> | |||
| <div className={cn('mb-8 w-[640px]', !shouldShowDataSourceTypeList && 'mt-12')}> | |||
| <Website | |||
| onPreview={setCurrentWebsite} | |||
| checkedCrawlResult={websitePages} | |||
| onCheckedCrawlResultChange={updateWebsitePages} | |||
| onCrawlProviderChange={onWebsiteCrawlProviderChange} | |||
| onJobIdChange={onWebsiteCrawlJobIdChange} | |||
| crawlOptions={crawlOptions} | |||
| onCrawlOptionsChange={onCrawlOptionsChange} | |||
| /> | |||
| </div> | |||
| {isShowVectorSpaceFull && ( | |||
| <div className='max-w-[640px] mb-4'> | |||
| <VectorSpaceFull /> | |||
| </div> | |||
| </> | |||
| )} | |||
| </> | |||
| )} | |||
| {dataSourceType === DataSourceType.WEB && ( | |||
| <> | |||
| <div className={cn('mb-8 w-[640px]', !shouldShowDataSourceTypeList && 'mt-12')}> | |||
| <Website | |||
| onPreview={setCurrentWebsite} | |||
| checkedCrawlResult={websitePages} | |||
| onCheckedCrawlResultChange={updateWebsitePages} | |||
| onCrawlProviderChange={onWebsiteCrawlProviderChange} | |||
| onJobIdChange={onWebsiteCrawlJobIdChange} | |||
| crawlOptions={crawlOptions} | |||
| onCrawlOptionsChange={onCrawlOptionsChange} | |||
| /> | |||
| </div> | |||
| {isShowVectorSpaceFull && ( | |||
| <div className='max-w-[640px] mb-4'> | |||
| <VectorSpaceFull /> | |||
| )} | |||
| <div className="flex justify-end gap-2 max-w-[640px]"> | |||
| {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */} | |||
| <Button disabled={isShowVectorSpaceFull || !websitePages.length} variant='primary' onClick={onStepChange}> | |||
| <span className="flex gap-0.5 px-[10px]"> | |||
| <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span> | |||
| <RiArrowRightLine className="size-4" /> | |||
| </span> | |||
| </Button> | |||
| </div> | |||
| )} | |||
| <div className="flex justify-end gap-2 max-w-[640px]"> | |||
| {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */} | |||
| <Button disabled={isShowVectorSpaceFull || !websitePages.length} variant='primary' onClick={onStepChange}> | |||
| <span className="flex gap-0.5 px-[10px]"> | |||
| <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span> | |||
| <RiArrowRightLine className="size-4" /> | |||
| </span> | |||
| </Button> | |||
| </div> | |||
| </> | |||
| )} | |||
| {!datasetId && ( | |||
| <> | |||
| <div className={s.dividerLine} /> | |||
| <span className="inline-flex items-center cursor-pointer text-[13px] leading-4 text-text-accent" onClick={modalShowHandle}> | |||
| <RiFolder6Line className="size-4 mr-1" /> | |||
| {t('datasetCreation.stepOne.emptyDatasetCreation')} | |||
| </span> | |||
| </> | |||
| )} | |||
| </> | |||
| )} | |||
| {!datasetId && ( | |||
| <> | |||
| <div className={s.dividerLine} /> | |||
| <span className="inline-flex items-center cursor-pointer text-[13px] leading-4 text-text-accent" onClick={modalShowHandle}> | |||
| <RiFolder6Line className="size-4 mr-1" /> | |||
| {t('datasetCreation.stepOne.emptyDatasetCreation')} | |||
| </span> | |||
| </> | |||
| )} | |||
| </div> | |||
| <EmptyDatasetCreationModal show={showModal} onHide={modalCloseHandle} /> | |||
| </div> | |||
| <EmptyDatasetCreationModal show={showModal} onHide={modalCloseHandle} /> | |||
| </div> | |||
| </div> | |||
| <div className='w-1/2 h-full overflow-y-auto'> | |||
| {currentFile && <FilePreview file={currentFile} hidePreview={hideFilePreview} />} | |||
| {currentNotionPage && <NotionPagePreview currentPage={currentNotionPage} hidePreview={hideNotionPagePreview} />} | |||
| {currentWebsite && <WebsitePreview payload={currentWebsite} hidePreview={hideWebsitePreview} />} | |||
| <div className='w-1/2 h-full overflow-y-auto'> | |||
| {currentFile && <FilePreview file={currentFile} hidePreview={hideFilePreview} />} | |||
| {currentNotionPage && <NotionPagePreview currentPage={currentNotionPage} hidePreview={hideNotionPagePreview} />} | |||
| {currentWebsite && <WebsitePreview payload={currentWebsite} hidePreview={hideWebsitePreview} />} | |||
| </div> | |||
| </div> | |||
| </div> | |||
| ) | |||