import React from 'react'; import { Box, Flex, MenuButton, Button, Link, useTheme, useDisclosure, HStack } from '@chakra-ui/react'; import { getDatasetCollectionPathById, postDatasetCollection, putDatasetCollectionById } from '@/web/core/dataset/api'; import { useQuery } from '@tanstack/react-query'; import { useTranslation } from 'next-i18next'; import MyIcon from '@fastgpt/web/components/common/Icon'; import MyInput from '@/components/MyInput'; import { useRequest } 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, TrainingModeEnum, DatasetTypeEnum, DatasetTypeMap, DatasetStatusEnum } from '@fastgpt/global/core/dataset/constants'; import EditFolderModal, { useEditFolder } from '../../../component/EditFolderModal'; import { TabEnum } from '../../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'; const FileSourceSelector = dynamic(() => import('../Import/components/FileSourceSelector')); const Header = ({}: {}) => { const { t } = useTranslation(); const theme = useTheme(); const { setLoading, feConfigs } = useSystemStore(); const datasetDetail = useContextSelector(DatasetPageContext, (v) => v.datasetDetail); const router = useRouter(); const { parentId = '' } = router.query as { parentId: string }; const { isPc } = useSystem(); const { searchText, setSearchText, total, getData, pageNum, onOpenWebsiteModal } = useContextSelector(CollectionPageContext, (v) => v); const { data: paths = [] } = useQuery(['getDatasetCollectionPathById', parentId], () => getDatasetCollectionPathById(parentId) ); 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 }); const { isOpen: isOpenFileSourceSelector, onOpen: onOpenFileSourceSelector, onClose: onCloseFileSourceSelector } = useDisclosure(); const { mutate: onCreateCollection } = useRequest({ mutationFn: async ({ name, type, callback, ...props }: { name: string; type: DatasetCollectionTypeEnum; callback?: (id: string) => void; trainingType?: TrainingModeEnum; rawLink?: string; chunkSize?: number; }) => { setLoading(true); const id = await postDatasetCollection({ parentId, datasetId: datasetDetail._id, name, type, ...props }); callback?.(id); return id; }, onSuccess() { getData(pageNum); }, onSettled() { setLoading(false); }, successToast: t('common:common.Create Success'), errorToast: t('common: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}) {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.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:Folder')} ), onClick: () => setEditFolderData({}) }, { label: ( {t('common:core.dataset.Manual collection')} ), onClick: () => { onOpenCreateVirtualFileModal({ defaultVal: '', onSuccess: (name) => { onCreateCollection({ name, type: DatasetCollectionTypeEnum.virtual }); } }); } }, { label: ( {t('common:core.dataset.Text collection')} ), onClick: onOpenFileSourceSelector }, { label: ( {t('common:core.dataset.Table collection')} ), onClick: () => router.replace({ query: { ...router.query, currentTab: TabEnum.import, source: ImportDataSourceEnum.csvTable } }) } ] } ]} /> )} {datasetDetail?.type === DatasetTypeEnum.websiteDataset && ( <> {datasetDetail?.websiteConfig?.url ? ( {datasetDetail.status === DatasetStatusEnum.active && ( )} {datasetDetail.status === DatasetStatusEnum.syncing && ( {t('common:core.dataset.status.syncing')} )} ) : ( )} )} {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 && } ); }; export default Header;