import React from 'react'; import { Box, Flex, MenuButton, Button, Link, useDisclosure, HStack } from '@chakra-ui/react'; import { getDatasetCollectionPathById, postDatasetCollection, putDatasetCollectionById } from '@/web/core/dataset/api'; import { useTranslation } from 'next-i18next'; import MyIcon from '@fastgpt/web/components/common/Icon'; import MyInput from '@/components/MyInput'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useRouter } from 'next/router'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import MyMenu from '@fastgpt/web/components/common/MyMenu'; import { useEditTitle } from '@/web/common/hooks/useEditTitle'; import { DatasetCollectionTypeEnum, DatasetTypeEnum, DatasetTypeMap, DatasetStatusEnum } from '@fastgpt/global/core/dataset/constants'; import EditFolderModal, { useEditFolder } from '../../EditFolderModal'; import { TabEnum } from '../../../../pages/dataset/detail/index'; import ParentPath from '@/components/common/ParentPaths'; import dynamic from 'next/dynamic'; import { ImportDataSourceEnum } from '@fastgpt/global/core/dataset/constants'; import { useContextSelector } from 'use-context-selector'; import { CollectionPageContext } from './Context'; import { DatasetPageContext } from '@/web/core/dataset/context/datasetPageContext'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import HeaderTagPopOver from './HeaderTagPopOver'; import MyBox from '@fastgpt/web/components/common/MyBox'; import Icon from '@fastgpt/web/components/common/Icon'; import MyTag from '@fastgpt/web/components/common/Tag/index'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; const FileSourceSelector = dynamic(() => import('../Import/components/FileSourceSelector')); const BackupImportModal = dynamic(() => import('./BackupImportModal')); const Header = ({ hasTrainingData }: { hasTrainingData: boolean }) => { const { t } = useTranslation(); const { feConfigs } = useSystemStore(); const { isPc } = useSystem(); const datasetDetail = useContextSelector(DatasetPageContext, (v) => v.datasetDetail); const router = useRouter(); const { parentId = '' } = router.query as { parentId: string }; const { searchText, setSearchText, total, getData, pageNum, onOpenWebsiteModal, openWebSyncConfirm } = useContextSelector(CollectionPageContext, (v) => v); const { data: paths = [] } = useRequest2(() => getDatasetCollectionPathById(parentId), { refreshDeps: [parentId], manual: false }); const { editFolderData, setEditFolderData } = useEditFolder(); const { onOpenModal: onOpenCreateVirtualFileModal, EditModal: EditCreateVirtualFileModal } = useEditTitle({ title: t('common:dataset.Create manual collection'), tip: t('common:dataset.Manual collection Tip'), canEmpty: false }); // Import collection const { isOpen: isOpenFileSourceSelector, onOpen: onOpenFileSourceSelector, onClose: onCloseFileSourceSelector } = useDisclosure(); // Backup import modal const { isOpen: isOpenBackupImportModal, onOpen: onOpenBackupImportModal, onClose: onCloseBackupImportModal } = useDisclosure(); const { runAsync: onCreateCollection } = useRequest2( async ({ name, type }: { name: string; type: DatasetCollectionTypeEnum }) => { const id = await postDatasetCollection({ parentId, datasetId: datasetDetail._id, name, type }); return id; }, { onSuccess() { getData(pageNum); }, successToast: t('common:create_success'), errorToast: t('common:create_failed') } ); const isWebSite = datasetDetail?.type === DatasetTypeEnum.websiteDataset; return ( ({ parentId: path.parentId, parentName: i === paths.length - 1 ? `${path.parentName}` : path.parentName }))} FirstPathDom={ {!isWebSite && } {t(DatasetTypeMap[datasetDetail?.type]?.collectionLabel as any)}({total}) {/* Website sync */} {datasetDetail?.websiteConfig?.url && ( {t('common:core.dataset.website.Base Url')}: {datasetDetail.websiteConfig.url} )} } onClick={(e) => { router.replace({ query: { ...router.query, parentId: e } }); }} /> {/* search input */} {isPc && ( } onChange={(e) => { setSearchText(e.target.value); }} /> )} {/* Tag */} {datasetDetail.type !== DatasetTypeEnum.websiteDataset && datasetDetail.permission.hasWritePer && feConfigs?.isPlus && } {/* diff collection button */} {datasetDetail.permission.hasWritePer && ( {datasetDetail?.type === DatasetTypeEnum.dataset && ( {t('common:dataset.collections.Create And Import')} } menuList={[ { children: [ { label: ( {t('common:core.dataset.Text collection')} ), onClick: onOpenFileSourceSelector }, { label: ( {t('common:core.dataset.Manual collection')} ), onClick: () => { onOpenCreateVirtualFileModal({ defaultVal: '', onSuccess: (name) => onCreateCollection({ name, type: DatasetCollectionTypeEnum.virtual }) }); } }, { label: ( {t('dataset:backup_dataset')} ), onClick: onOpenBackupImportModal } ] }, { children: [ { label: ( {t('common:Folder')} ), onClick: () => setEditFolderData({}) } ] } ]} /> )} {datasetDetail?.type === DatasetTypeEnum.websiteDataset && ( <> {datasetDetail?.websiteConfig?.url ? ( <> {datasetDetail.status === DatasetStatusEnum.active && ( {!hasTrainingData && ( )} )} {datasetDetail.status === DatasetStatusEnum.syncing && ( {t('common:core.dataset.status.syncing')} )} {datasetDetail.status === DatasetStatusEnum.waiting && ( {t('common:core.dataset.status.waiting')} )} {datasetDetail.status === DatasetStatusEnum.error && ( {t('dataset:status_error')} )} ) : ( )} )} {datasetDetail?.type === DatasetTypeEnum.externalFile && ( {t('common:dataset.collections.Create And Import')} } menuList={[ { children: [ { label: ( {t('common:Folder')} ), onClick: () => setEditFolderData({}) }, { label: ( {t('common:core.dataset.Text collection')} ), onClick: () => router.replace({ query: { ...router.query, currentTab: TabEnum.import, source: ImportDataSourceEnum.externalFile } }) } ] } ]} /> )} {/* apiDataset */} {(datasetDetail?.type === DatasetTypeEnum.apiDataset || datasetDetail?.type === DatasetTypeEnum.feishu || datasetDetail?.type === DatasetTypeEnum.yuque) && ( router.replace({ query: { ...router.query, currentTab: TabEnum.import, source: ImportDataSourceEnum.apiDataset } }) } > {t('dataset:add_file')} )} )} {/* modal */} {!!editFolderData && ( setEditFolderData(undefined)} editCallback={async (name) => { try { if (editFolderData.id) { await putDatasetCollectionById({ id: editFolderData.id, name }); getData(pageNum); } else { onCreateCollection({ name, type: DatasetCollectionTypeEnum.folder }); } } catch (error) { return Promise.reject(error); } }} isEdit={!!editFolderData.id} name={editFolderData.name} /> )} {isOpenFileSourceSelector && } {isOpenBackupImportModal && ( { getData(1); }} onClose={onCloseBackupImportModal} /> )} ); }; export default Header;