diff --git a/packages/web/components/common/Icon/constants.ts b/packages/web/components/common/Icon/constants.ts index 90dc9e790..f89af800c 100644 --- a/packages/web/components/common/Icon/constants.ts +++ b/packages/web/components/common/Icon/constants.ts @@ -128,9 +128,12 @@ export const iconPaths = { 'core/chat/speaking': () => import('./icons/core/chat/speaking.svg'), 'core/chat/stopSpeech': () => import('./icons/core/chat/stopSpeech.svg'), 'core/dataset/commonDataset': () => import('./icons/core/dataset/commonDataset.svg'), + 'core/dataset/commonDatasetColor': () => import('./icons/core/dataset/commonDatasetColor.svg'), 'core/dataset/datasetFill': () => import('./icons/core/dataset/datasetFill.svg'), 'core/dataset/datasetLight': () => import('./icons/core/dataset/datasetLight.svg'), 'core/dataset/externalDataset': () => import('./icons/core/dataset/externalDataset.svg'), + 'core/dataset/externalDatasetColor': () => + import('./icons/core/dataset/externalDatasetColor.svg'), 'core/dataset/fileCollection': () => import('./icons/core/dataset/fileCollection.svg'), 'core/dataset/fullTextRecall': () => import('./icons/core/dataset/fullTextRecall.svg'), 'core/dataset/manualCollection': () => import('./icons/core/dataset/manualCollection.svg'), @@ -141,6 +144,7 @@ export const iconPaths = { 'core/dataset/tableCollection': () => import('./icons/core/dataset/tableCollection.svg'), 'core/dataset/tag': () => import('./icons/core/dataset/tag.svg'), 'core/dataset/websiteDataset': () => import('./icons/core/dataset/websiteDataset.svg'), + 'core/dataset/websiteDatasetColor': () => import('./icons/core/dataset/websiteDatasetColor.svg'), 'core/modules/basicNode': () => import('./icons/core/modules/basicNode.svg'), 'core/modules/fixview': () => import('./icons/core/modules/fixview.svg'), 'core/modules/flowLight': () => import('./icons/core/modules/flowLight.svg'), diff --git a/packages/web/components/common/Icon/icons/core/dataset/commonDatasetColor.svg b/packages/web/components/common/Icon/icons/core/dataset/commonDatasetColor.svg new file mode 100644 index 000000000..ffcca3a46 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/dataset/commonDatasetColor.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/packages/web/components/common/Icon/icons/core/dataset/externalDatasetColor.svg b/packages/web/components/common/Icon/icons/core/dataset/externalDatasetColor.svg new file mode 100644 index 000000000..b1276dc27 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/dataset/externalDatasetColor.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/web/components/common/Icon/icons/core/dataset/websiteDatasetColor.svg b/packages/web/components/common/Icon/icons/core/dataset/websiteDatasetColor.svg new file mode 100644 index 000000000..c3943a6aa --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/dataset/websiteDatasetColor.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/web/i18n/en/common.json b/packages/web/i18n/en/common.json index 9c8672259..4aa5c41cb 100644 --- a/packages/web/i18n/en/common.json +++ b/packages/web/i18n/en/common.json @@ -500,10 +500,12 @@ "logs": { "api": "API call", "feishu": "Lark", + "official_account": "Official account", "online": "Online use", "share": "External link call", "team": "Team chat", - "test": "Test" + "test": "Test", + "wecom": "Enterprise WeChat" }, "markdown": { "Edit Question": "Edit question", @@ -560,7 +562,7 @@ "Avatar": "Dataset avatar", "Choose Dataset": "Associate dataset", "Collection": "Dataset", - "Create dataset": "Create a dataset", + "Create dataset": "Create a {{name}}", "Dataset": "Dataset", "Dataset ID": "Dataset ID", "Dataset Type": "Dataset type", @@ -615,8 +617,7 @@ "success": "Start syncing" } }, - "training": { - } + "training": {} }, "data": { "Auxiliary Data": "Auxiliary data", @@ -1029,6 +1030,7 @@ }, "input is empty": "Data content cannot be empty" }, + "dataset_name": "Knowledge base name", "deleteFolderTips": "Confirm to delete this folder and all the datasets it contains? Once deleted, data cannot be recovered. Please confirm!", "test": { "noResult": "No results found" @@ -1316,9 +1318,7 @@ "Sub plan": "Subscription plan", "Sub plan tip": "Free use of {{title}} or upgrade to a higher plan", "Team plan and usage": "Plan and usage", - "web_site_sync": "Website sync", "Training weight": "Training priority: {{weight}}", - "rerank": "Rerank", "Update extra ai points": "Extra AI points", "Update extra dataset size": "Extra storage", "Upgrade plan": "Upgrade plan", @@ -1338,6 +1338,7 @@ "Year sale": "Two months free" }, "point": "integral", + "rerank": "Rerank", "standardSubLevel": { "enterprise": "Enterprise edition", "experience": "Experience edition", @@ -1351,7 +1352,8 @@ "extraDatasetSize": "Knowledge base expansion", "extraPoints": "AI points package", "standard": "Plan subscription" - } + }, + "web_site_sync": "Website sync" }, "usage": { "Ai model": "AI model", diff --git a/packages/web/i18n/en/publish.json b/packages/web/i18n/en/publish.json index 11b25fe34..63cb657b1 100644 --- a/packages/web/i18n/en/publish.json +++ b/packages/web/i18n/en/publish.json @@ -15,10 +15,15 @@ "key_alias": "key alias, for display only ", "key_tips": "You can use the API Key to access certain interfaces (you can't access the app, you need to use the API key within the app to access the app)", "link_name": "Name of the share link", + "new_feishu_bot": "Added Feishu robot", "official_account": { + "api": "WeChat public account API", + "create_modal_title": "Create a WeChat public account to access", + "desc": "Directly access WeChat official account through API", + "edit_modal_title": "Edit WeChat public account access", + "name": "WeChat public account access", "params": "Wechat params" }, - "new_feishu_bot": "Added Feishu robot", "publish_name": "name", "qpm_is_empty": "QPM cannot be empty", "qpm_tips": "How many times per minute can each IP ask at most", diff --git a/packages/web/i18n/en/user.json b/packages/web/i18n/en/user.json index 06c254a9e..554ad3a80 100644 --- a/packages/web/i18n/en/user.json +++ b/packages/web/i18n/en/user.json @@ -87,6 +87,9 @@ "no_collaborators": "No collaborators yet" }, "usage": { - "feishu": "Lark" + "feishu": "Lark", + "official_account": "Official account", + "share": "share link", + "wecom": "Enterprise WeChat" } } diff --git a/packages/web/i18n/zh/common.json b/packages/web/i18n/zh/common.json index ecb84b257..0155c8e0d 100644 --- a/packages/web/i18n/zh/common.json +++ b/packages/web/i18n/zh/common.json @@ -565,7 +565,7 @@ "Avatar": "知识库头像", "Choose Dataset": "关联知识库", "Collection": "数据集", - "Create dataset": "创建一个知识库", + "Create dataset": "创建一个{{name}}", "Dataset": "知识库", "Dataset ID": "知识库 ID", "Dataset Type": "知识库类型", @@ -996,6 +996,7 @@ "Edit Folder": "编辑文件夹", "Edit Info": "编辑信息", "Export": "导出", + "dataset_name": "知识库名称", "Export Dataset Limit Error": "导出数据失败", "Folder Name": "输入文件夹名称", "Insert Data": "插入", diff --git a/projects/app/src/pages/dataset/list/component/CreateModal.tsx b/projects/app/src/pages/dataset/list/component/CreateModal.tsx index 2bac50384..9a38921f4 100644 --- a/projects/app/src/pages/dataset/list/component/CreateModal.tsx +++ b/projects/app/src/pages/dataset/list/component/CreateModal.tsx @@ -1,4 +1,4 @@ -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { Box, Flex, Button, ModalFooter, ModalBody, Input } from '@chakra-ui/react'; import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; import { useForm } from 'react-hook-form'; @@ -14,29 +14,56 @@ import MyModal from '@fastgpt/web/components/common/MyModal'; import { postCreateDataset } from '@/web/core/dataset/api'; import type { CreateDatasetParams } from '@/global/core/dataset/api.d'; import { useTranslation } from 'next-i18next'; -import MyRadio from '@/components/common/MyRadio'; import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'; import AIModelSelector from '@/components/Select/AIModelSelector'; -import { useI18n } from '@/web/context/I18n'; + import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; -const CreateModal = ({ onClose, parentId }: { onClose: () => void; parentId?: string }) => { +export type CreateDatasetType = + | DatasetTypeEnum.dataset + | DatasetTypeEnum.externalFile + | DatasetTypeEnum.websiteDataset; + +const CreateModal = ({ + onClose, + parentId, + type +}: { + onClose: () => void; + parentId?: string; + type: CreateDatasetType; +}) => { const { t } = useTranslation(); - const { datasetT } = useI18n(); const { toast } = useToast(); const router = useRouter(); - const { feConfigs, vectorModelList, datasetModelList } = useSystemStore(); + const { vectorModelList, datasetModelList } = useSystemStore(); const { isPc } = useSystem(); + const databaseNameMap = useMemo(() => { + return { + [DatasetTypeEnum.dataset]: t('dataset:common_dataset'), + [DatasetTypeEnum.externalFile]: t('dataset:external_file'), + [DatasetTypeEnum.websiteDataset]: t('dataset:website_dataset') + }; + }, [t]); + + const iconMap = useMemo(() => { + return { + [DatasetTypeEnum.dataset]: 'core/dataset/commonDatasetColor', + [DatasetTypeEnum.externalFile]: 'core/dataset/externalDatasetColor', + [DatasetTypeEnum.websiteDataset]: 'core/dataset/websiteDatasetColor' + }; + }, []); + const filterNotHiddenVectorModelList = vectorModelList.filter((item) => !item.hidden); const { register, setValue, handleSubmit, watch } = useForm({ defaultValues: { parentId, - type: DatasetTypeEnum.dataset, - avatar: '/icon/logo.svg', + type: type || DatasetTypeEnum.dataset, + avatar: iconMap[type] || 'core/dataset/commonDatasetColor', name: '', intro: '', vectorModel: filterNotHiddenVectorModelList[0].model, @@ -44,7 +71,6 @@ const CreateModal = ({ onClose, parentId }: { onClose: () => void; parentId?: st } }); const avatar = watch('avatar'); - const datasetType = watch('type'); const vectorModel = watch('vectorModel'); const agentModel = watch('agentModel'); @@ -88,63 +114,16 @@ const CreateModal = ({ onClose, parentId }: { onClose: () => void; parentId?: st } }); - const onSelectDatasetType = useCallback( - (e: DatasetTypeEnum) => { - if ( - !feConfigs?.isPlus && - (e === DatasetTypeEnum.websiteDataset || e === DatasetTypeEnum.externalFile) - ) { - return toast({ - status: 'warning', - title: t('common:common.system.Commercial version function') - }); - } - setValue('type', e); - }, - [feConfigs?.isPlus, setValue, t, toast] - ); - return ( - <> - - {t('common:core.dataset.Dataset Type')} - - - {t('common:common.Set Name')} diff --git a/projects/app/src/pages/dataset/list/component/List.tsx b/projects/app/src/pages/dataset/list/component/List.tsx index 4b1e26684..ce348fbb3 100644 --- a/projects/app/src/pages/dataset/list/component/List.tsx +++ b/projects/app/src/pages/dataset/list/component/List.tsx @@ -49,7 +49,8 @@ function List() { setEditedDataset, onDelDataset, onUpdateDataset, - myDatasets + myDatasets, + folderDetail } = useContextSelector(DatasetsContext, (v) => v); const [editPerDatasetIndex, setEditPerDatasetIndex] = useState(); const [loadingDatasetId, setLoadingDatasetId] = useState(); @@ -142,11 +143,14 @@ function List() { <> {formatDatasets.length > 0 && ( {formatDatasets.map((dataset, index) => ( void; onDelDataset: (id: string) => Promise; onUpdateDataset: (data: DatasetUpdateBody) => Promise; + searchKey: string; + setSearchKey: React.Dispatch>; }; export const DatasetsContext = createContext({ @@ -57,7 +59,11 @@ export const DatasetsContext = createContext({ onUpdateDataset: function (_data: DatasetUpdateBody): Promise { throw new Error('Function not implemented.'); }, - myDatasets: [] + myDatasets: [], + searchKey: '', + setSearchKey: function (value: React.SetStateAction): void { + throw new Error('Function not implemented.'); + } }); function DatasetContextProvider({ children }: { children: React.ReactNode }) { @@ -65,7 +71,7 @@ function DatasetContextProvider({ children }: { children: React.ReactNode }) { const { commonT } = useI18n(); const { t } = useTranslation(); const [moveDatasetId, setMoveDatasetId] = useState(); - + const [searchKey, setSearchKey] = useState(''); const { parentId = null } = router.query as { parentId?: string | null }; const { @@ -75,11 +81,12 @@ function DatasetContextProvider({ children }: { children: React.ReactNode }) { } = useRequest2( () => getDatasets({ + searchKey, parentId }), { manual: false, - refreshDeps: [parentId] + refreshDeps: [parentId, searchKey] } ); @@ -145,7 +152,9 @@ function DatasetContextProvider({ children }: { children: React.ReactNode }) { onDelDataset, onUpdateDataset, myDatasets, - loadMyDatasets + loadMyDatasets, + searchKey, + setSearchKey }; return ( diff --git a/projects/app/src/pages/dataset/list/index.tsx b/projects/app/src/pages/dataset/list/index.tsx index cf2efd48e..69b17e481 100644 --- a/projects/app/src/pages/dataset/list/index.tsx +++ b/projects/app/src/pages/dataset/list/index.tsx @@ -1,5 +1,14 @@ -import React, { useState } from 'react'; -import { Box, Flex, Image, Button, useDisclosure } from '@chakra-ui/react'; +import React, { useCallback, useMemo, useState } from 'react'; +import { + Box, + Flex, + Image, + Button, + useDisclosure, + InputGroup, + InputLeftElement, + Input +} from '@chakra-ui/react'; import { useRouter } from 'next/router'; import PageContainer from '@/components/PageContainer'; import { useTranslation } from 'next-i18next'; @@ -28,6 +37,10 @@ import { getCollaboratorList } from '@/web/core/dataset/api/collaborator'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; +import { CreateDatasetType } from './component/CreateModal'; +import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; +import { useToast } from '@fastgpt/web/hooks/useToast'; +import MyBox from '@fastgpt/web/components/common/MyBox'; const EditFolderModal = dynamic( () => import('@fastgpt/web/components/common/MyModal/EditFolderModal') @@ -52,32 +65,62 @@ const Dataset = () => { setEditedDataset, setMoveDatasetId, onDelDataset, - onUpdateDataset + onUpdateDataset, + searchKey, + setSearchKey } = useContextSelector(DatasetsContext, (v) => v); const { userInfo } = useUserStore(); - + const { toast } = useToast(); const [editFolderData, setEditFolderData] = useState(); + const [createDatasetType, setCreateDatasetType] = useState(); - const { - isOpen: isOpenCreateModal, - onOpen: onOpenCreateModal, - onClose: onCloseCreateModal - } = useDisclosure(); + const onSelectDatasetType = useCallback( + (e: CreateDatasetType) => { + if ( + !feConfigs?.isPlus && + (e === DatasetTypeEnum.websiteDataset || e === DatasetTypeEnum.externalFile) + ) { + return toast({ + status: 'warning', + title: t('common:common.system.Commercial version function') + }); + } + setCreateDatasetType(e); + }, + [t, toast] + ); + const RenderSearchInput = useMemo( + () => ( + + + + + setSearchKey(e.target.value)} + placeholder={t('common:dataset.dataset_name')} + maxLength={30} + bg={'white'} + /> + + ), + [searchKey, setSearchKey, t] + ); return ( - - + - {''} - + {t('common:core.dataset.My Dataset')} @@ -90,10 +133,14 @@ const Dataset = () => { }); }} /> + + {isPc && RenderSearchInput} + {userInfo?.team?.permission.hasWritePer && ( @@ -106,22 +153,31 @@ const Dataset = () => { { children: [ { - label: ( - - - {t('common:Folder')} - - ), - onClick: () => setEditFolderData({}) + icon: 'core/dataset/commonDatasetColor', + label: t('dataset:common_dataset'), + description: t('dataset:common_dataset_desc'), + onClick: () => setCreateDatasetType(DatasetTypeEnum.dataset) }, { - label: ( - - {''} - {t('common:core.dataset.Dataset')} - - ), - onClick: onOpenCreateModal + icon: 'core/dataset/websiteDatasetColor', + label: t('dataset:website_dataset'), + description: t('dataset:website_dataset_desc'), + onClick: () => setCreateDatasetType(DatasetTypeEnum.websiteDataset) + }, + { + icon: 'core/dataset/externalDatasetColor', + label: t('dataset:external_file'), + description: t('dataset:external_file_dataset_desc'), + onClick: () => setCreateDatasetType(DatasetTypeEnum.externalFile) + } + ] + }, + { + children: [ + { + icon: FolderIcon, + label: t('common:Folder'), + onClick: () => setEditFolderData({}) } ] } @@ -129,6 +185,9 @@ const Dataset = () => { /> )} + + {!isPc && {RenderSearchInput}} + @@ -231,13 +290,16 @@ const Dataset = () => { }} /> )} - {isOpenCreateModal && ( - + {createDatasetType && ( + setCreateDatasetType(undefined)} + parentId={parentId || undefined} + /> )} - + ); }; - export async function getServerSideProps(content: any) { return { props: {