From c9e3a9e56adc63e86395f340c3c56ca9e34aa2fc Mon Sep 17 00:00:00 2001 From: Yi Date: Fri, 27 Sep 2024 17:44:01 +0800 Subject: [PATCH] feat: add external api from the create external knowledge page --- web/app/(commonLayout)/datasets/Container.tsx | 83 ++++++++++--------- .../(commonLayout)/datasets/connect/page.tsx | 5 +- .../connector/index.tsx | 4 +- .../create/ExternalApiSelect.tsx | 73 ++++++++++++++++ .../create/ExternalApiSelection.tsx | 34 ++++++-- web/context/external-api-panel-context.tsx | 28 +++++++ web/i18n/en-US/dataset.ts | 4 + web/i18n/zh-Hans/dataset.ts | 4 + 8 files changed, 188 insertions(+), 47 deletions(-) create mode 100644 web/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx create mode 100644 web/context/external-api-panel-context.tsx diff --git a/web/app/(commonLayout)/datasets/Container.tsx b/web/app/(commonLayout)/datasets/Container.tsx index 3fbbf12d4e..44d898adc4 100644 --- a/web/app/(commonLayout)/datasets/Container.tsx +++ b/web/app/(commonLayout)/datasets/Container.tsx @@ -28,13 +28,14 @@ import { fetchDatasetApiBaseUrl } from '@/service/datasets' import { useTabSearchParams } from '@/hooks/use-tab-searchparams' import { useStore as useTagStore } from '@/app/components/base/tag-management/store' import { useAppContext } from '@/context/app-context' +import { ExternalApiPanelProvider, useExternalApiPanel } from '@/context/external-api-panel-context' -const Container = () => { +const ContainerContent = () => { const { t } = useTranslation() const router = useRouter() const { currentWorkspace } = useAppContext() const showTagManagementModal = useTagStore(s => s.showTagManagementModal) - const [showExternalApiPanel, setShowExternalApiPanel] = useState(false) + const { showExternalApiPanel, setShowExternalApiPanel } = useExternalApiPanel() const options = useMemo(() => { return [ @@ -74,45 +75,51 @@ const Container = () => { }, [currentWorkspace, router]) return ( - -
-
- setActiveTab(newActiveTab)} - options={options} - /> - {activeTab === 'dataset' && ( -
- - -
- -
- )} - {activeTab === 'api' && data && } -
- +
+
+ setActiveTab(newActiveTab)} + options={options} + /> {activeTab === 'dataset' && ( - <> - - - {showTagManagementModal && ( - - )} - +
+ + +
+ +
)} - - {activeTab === 'api' && data && } - - {showExternalApiPanel && setShowExternalApiPanel(false)} isShow={showExternalApiPanel} datasetBindings={[]} />} + {activeTab === 'api' && data && }
+ {activeTab === 'dataset' && ( + <> + + + {showTagManagementModal && ( + + )} + + )} + {activeTab === 'api' && data && } + + {showExternalApiPanel && setShowExternalApiPanel(false)} isShow={showExternalApiPanel} datasetBindings={[]} />} +
+ ) +} + +const Container = () => { + return ( + + + + ) } diff --git a/web/app/(commonLayout)/datasets/connect/page.tsx b/web/app/(commonLayout)/datasets/connect/page.tsx index 2a66837585..78647e874b 100644 --- a/web/app/(commonLayout)/datasets/connect/page.tsx +++ b/web/app/(commonLayout)/datasets/connect/page.tsx @@ -1,11 +1,14 @@ import React from 'react' import ExternalKnowledgeBaseConnector from '@/app/components/datasets/external-knowledge-base/connector' import { ExternalKnowledgeApiProvider } from '@/context/external-knowledge-api-context' +import { ExternalApiPanelProvider } from '@/context/external-api-panel-context' const ExternalKnowledgeBaseCreation = async () => { return ( - + + + ) } diff --git a/web/app/components/datasets/external-knowledge-base/connector/index.tsx b/web/app/components/datasets/external-knowledge-base/connector/index.tsx index b1a1ab9b3f..33f57d0b47 100644 --- a/web/app/components/datasets/external-knowledge-base/connector/index.tsx +++ b/web/app/components/datasets/external-knowledge-base/connector/index.tsx @@ -28,7 +28,9 @@ const ExternalKnowledgeBaseConnector = () => { } setLoading(false) } - return + return ( + + ) } export default ExternalKnowledgeBaseConnector diff --git a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx new file mode 100644 index 0000000000..1cc88fb872 --- /dev/null +++ b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx @@ -0,0 +1,73 @@ +import React, { useState } from 'react' +import { RiArrowDownSLine } from '@remixicon/react' +import { useTranslation } from 'react-i18next' +import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development' + +type ApiItem = { + value: string + name: string + url: string +} + +type ExternalApiSelectProps = { + items: ApiItem[] + defaultValue?: string + onSelect: (item: ApiItem) => void +} + +const ExternalApiSelect: React.FC = ({ items, defaultValue, onSelect }) => { + const { t } = useTranslation() + const [isOpen, setIsOpen] = useState(false) + const [selectedItem, setSelectedItem] = useState( + items.find(item => item.value === defaultValue) || null, + ) + + const handleSelect = (item: ApiItem) => { + setSelectedItem(item) + onSelect(item) + setIsOpen(false) + } + + return ( +
+
setIsOpen(!isOpen)} + > + {selectedItem + ? ( +
+ +
+ {selectedItem.name} +
+
+ ) + : ( + {t('dataset.selectExternalKnowledgeAPI.placeholder')} + )} + +
+ {isOpen && ( +
+ {items.map(item => ( +
handleSelect(item)} + > +
+ + {item.name} + {item.url} +
+
+ ))} +
+ )} +
+ ) +} + +export default ExternalApiSelect diff --git a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx index b353f6e237..d785d8aec8 100644 --- a/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx +++ b/web/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx @@ -1,8 +1,13 @@ import React, { useEffect } from 'react' import { useTranslation } from 'react-i18next' -import Select from '@/app/components/base/select' +import { RiAddLine } from '@remixicon/react' +import { useRouter } from 'next/navigation' +import ExternalApiSelect from './ExternalApiSelect' import Input from '@/app/components/base/input' +import Button from '@/app/components/base/button' import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context' +import { useExternalApiPanel } from '@/context/external-api-panel-context' + type ExternalApiSelectionProps = { external_knowledge_api_id: string external_knowledge_id: string @@ -11,13 +16,23 @@ type ExternalApiSelectionProps = { const ExternalApiSelection: React.FC = ({ external_knowledge_api_id, external_knowledge_id, onChange }) => { const { t } = useTranslation() + const router = useRouter() const { externalKnowledgeApiList } = useExternalKnowledgeApi() + // const { setShowExternalApiPanel } = useExternalApiPanel() const apiItems = externalKnowledgeApiList.map(api => ({ value: api.id, name: api.name, + url: api.settings.endpoint, })) + const { showExternalApiPanel, setShowExternalApiPanel } = useExternalApiPanel() + + const handleAddNewAPI = () => { + router.back() + setShowExternalApiPanel(true) + } + useEffect(() => { if (!external_knowledge_api_id && apiItems.length > 0) onChange({ external_knowledge_api_id: apiItems[0].value, external_knowledge_id }) @@ -29,12 +44,17 @@ const ExternalApiSelection: React.FC = ({ external_kn
-