| }, [files, isShowVectorSpaceFull]) | }, [files, isShowVectorSpaceFull]) | ||||
| return ( | 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> | ||||
| <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> | ||||
| )} | |||||
| <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> | </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> | ||||
| )} | |||||
| <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> | </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> | ||||
| )} | |||||
| <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> | </div> | ||||
| <EmptyDatasetCreationModal show={showModal} onHide={modalCloseHandle} /> | |||||
| </div> | </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> | ||||
| </div> | </div> | ||||
| ) | ) |