diff --git a/web/client/api/flow/index.ts b/web/client/api/flow/index.ts index 7f32ac1d9..67c6462e4 100644 --- a/web/client/api/flow/index.ts +++ b/web/client/api/flow/index.ts @@ -35,8 +35,8 @@ export const deleteFlowById = (id: string) => { return DELETE(`/api/v2/serve/awel/flows/${id}`); }; -export const getFlowNodes = () => { - return GET>(`/api/v2/serve/awel/nodes`); +export const getFlowNodes = (tags?: string) => { + return GET<{ tags?: string }, Array>(`/api/v2/serve/awel/nodes`, { tags }); }; export const refreshFlowNodeById = (data: IFlowRefreshParams) => { diff --git a/web/components/flow/add-nodes-sider.tsx b/web/components/flow/add-nodes-sider.tsx index b5a5f6d3c..d71a12707 100644 --- a/web/components/flow/add-nodes-sider.tsx +++ b/web/components/flow/add-nodes-sider.tsx @@ -4,7 +4,7 @@ import { IFlowNode } from '@/types/flow'; import { FLOW_NODES_KEY } from '@/utils'; import { CaretLeftOutlined, CaretRightOutlined } from '@ant-design/icons'; import type { CollapseProps } from 'antd'; -import { Badge, Collapse, Input, Layout, Space } from 'antd'; +import { Badge, Collapse, Input, Layout, Space, Tag } from 'antd'; import React, { useContext, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import StaticNodes from './static-nodes'; @@ -12,6 +12,8 @@ import StaticNodes from './static-nodes'; const { Search } = Input; const { Sider } = Layout; +const TAGS = JSON.stringify({ order: 'higher-order' }); + type GroupType = { category: string; categoryLabel: string; @@ -41,13 +43,16 @@ const AddNodesSider: React.FC = () => { const [resources, setResources] = useState>([]); const [operatorsGroup, setOperatorsGroup] = useState([]); const [resourcesGroup, setResourcesGroup] = useState([]); + const [isAllNodesVisible, setIsAllNodesVisible] = useState(false); useEffect(() => { - getNodes(); + getNodes(TAGS); }, []); - async function getNodes() { - const [_, data] = await apiInterceptors(getFlowNodes()); + // tags is optional, if tags is not passed, it will get all nodes + async function getNodes(tags?: string) { + const [_, data] = await apiInterceptors(getFlowNodes(tags)); + if (data && data.length > 0) { localStorage.setItem(FLOW_NODES_KEY, JSON.stringify(data)); const operatorNodes = data.filter(node => node.flow_type === 'operator'); @@ -166,6 +171,16 @@ const AddNodesSider: React.FC = () => { setSearchValue(val); } + function onModeChange() { + if (isAllNodesVisible) { + getNodes(TAGS); + } else { + getNodes(); + } + + setIsAllNodesVisible(!isAllNodesVisible); + } + return ( { onCollapse={collapsed => setCollapsed(collapsed)} > -

- {t('add_node')} -

+
+

+ {t('add_node')} +

+ + + {isAllNodesVisible ? t('All_Nodes') : t('Higher_Order_Nodes')} + +
diff --git a/web/components/flow/canvas-node.tsx b/web/components/flow/canvas-node.tsx index 37449337d..aa0378c2f 100644 --- a/web/components/flow/canvas-node.tsx +++ b/web/components/flow/canvas-node.tsx @@ -142,7 +142,7 @@ const CanvasNode: React.FC = ({ data }) => { return (
- {(outputs || []).map((output, index) => ( + {outputs?.map((output, index) => (