Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/x-flow/src/XFlow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ const XFlow: FC<FlowProps> = memo(props => {
isAddingNode: false,
});
}
} else if (e.key === 'Escape'){
setOpenPanel(false)
}
});

Expand Down
51 changes: 32 additions & 19 deletions packages/x-flow/src/components/CustomNode/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,30 @@ export default memo((props: any) => {
};
}, [menuItem, isEnd]);

const renderHandleMemo = useCallback(()=>{
if(renderHandle){
return renderHandle(
SourceHandle,
{
position:sourcePosition,
isConnectable:connectable,
selected:selected,
isHovered:isHovered,
handleAddNode:handleAddNode
},
{
id,
type,
data,
layout,
isConnectable,
readOnly
}
)
}
return null
},[renderHandle,SourceHandle,sourcePosition,connectable,selected,isHovered,handleAddNode,id,type,data,layout,isConnectable,readOnly])

return (
<div
className={classNames('xflow-node-container', {
Expand All @@ -292,7 +316,12 @@ export default memo((props: any) => {
>
{!settingMap?.[type]?.targetHandleHidden && !isNote && (
<Handle
{...handleProps}
isValidConnection={(edge)=>{
if(handleProps.isValidConnection){
return handleProps.isValidConnection(edge,'target',type)
}
return true
}}
type="target"
position={targetPosition}
isConnectable={connectable}
Expand Down Expand Up @@ -333,24 +362,7 @@ export default memo((props: any) => {
<div onClick={()=>{
onClick(data)
}}>
{renderHandle(
SourceHandle,
{
position:sourcePosition,
isConnectable:connectable,
selected:selected,
isHovered:isHovered,
handleAddNode:handleAddNode
},
{
id,
type,
data,
layout,
isConnectable,
readOnly
}
)}
{renderHandleMemo()}
</div>
:
<Fragment>
Expand All @@ -363,6 +375,7 @@ export default memo((props: any) => {
isHovered={isHovered}
handleAddNode={handleAddNode}
isConnected={isSourceHandleConnected}
nodeType={type}
// isConnectableStart={isConnectableStart}
// isConnectableEnd={isConnectableEnd}
/>
Expand Down
11 changes: 9 additions & 2 deletions packages/x-flow/src/components/CustomNode/sourceHandle.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { PlusOutlined } from '@ant-design/icons';
import { Handle } from '@xyflow/react';
import { Tooltip } from 'antd';
import classNames from 'classnames';
import React, { ComponentProps, memo, useContext, useMemo, useRef, useState } from 'react';
import React, { ComponentProps, memo, useContext, useEffect, useMemo, useRef, useState } from 'react';
import NodeSelectPopover from '../NodesPopover';
import { ConfigContext } from '../../models/context';
import './index.less';
Expand All @@ -18,6 +18,7 @@ export default memo((props:Partial<HandleProps> & Record<string,any> ) => {
handleAddNode,
switchTitle,
isConnected, // 是否有连接的节点
nodeType,
...rest
} = props;
const [isShowTooltip, setIsShowTooltip] = useState(false);
Expand All @@ -40,7 +41,12 @@ export default memo((props:Partial<HandleProps> & Record<string,any> ) => {

return (
<Handle
{...handleProps}
isValidConnection={(edge)=>{
if(handleProps.isValidConnection){
return handleProps.isValidConnection(edge,'source',nodeType)
}
return true
}}
type="source"
position={position}
isConnectable={isConnectable}
Expand Down Expand Up @@ -72,6 +78,7 @@ export default memo((props:Partial<HandleProps> & Record<string,any> ) => {
addNode={handleAddNode}
ref={popoverRef}
onNodeSelectPopoverChange={val => setOpenNodeSelectPopover(val)}
nodeType={nodeType}
>
<Tooltip
title="点击添加节点"
Expand Down
12 changes: 9 additions & 3 deletions packages/x-flow/src/components/NodesPopover/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,21 @@ import NodesMenu from '../NodesMenu';
import './index.less';

export default forwardRef((props: any, popoverRef) => {
const { addNode, children, onNodeSelectPopoverChange } = props;
const { addNode, children, onNodeSelectPopoverChange,nodeType } = props;
const { setIsAddingNode } = useStore(s => ({
setIsAddingNode: s.setIsAddingNode,
}));
const ref = useRef<any>(null);
const closeRef: any = useRef<HTMLButtonElement>(null);
const [open, setOpen] = useState(false);

const { settings, nodeSelector, antdVersion ,readOnly ,clickAddNode,settingMap }: any = useContext(ConfigContext);
const { settings, nodeSelector, antdVersion ,readOnly ,clickAddNode,settingMap,filterSettings }: any = useContext(ConfigContext);
const items = useMemo(()=>{
if(typeof filterSettings === 'function'){
return filterSettings(settings,nodeType)
}
return settings
},[settings,nodeType])
const { showSearch, popoverProps = { placement: 'top' } } =
nodeSelector || {};

Expand Down Expand Up @@ -97,7 +103,7 @@ export default forwardRef((props: any, popoverRef) => {
content={
<NodesMenu
ref={ref}
items={settings}
items={items}
showSearch={showSearch}
onClick={handCreateNode}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ export default memo((props: any) => {
(edges || [])?.filter(flow => flow?.sourceHandle === item?._id)
?.length > 0
}
nodeType={'Parallel'}
/>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ export default memo((props: any) => {
(edges || [])?.filter(flow => flow?.sourceHandle === item?._id)
?.length > 0
}
nodeType={'switch'}
/>
</div>
);
Expand Down Expand Up @@ -140,6 +141,7 @@ export default memo((props: any) => {
flow?.sourceHandle === 'id_else' && flow?.source === id
)?.length > 0
}
nodeType={'Switch'}
/>
</div>
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/x-flow/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ export interface TControl{
export interface THandle{
// isConnectableStart?:boolean
// isConnectableEnd?:boolean
isValidConnection?:HandleProps['isValidConnection']
isValidConnection?:(edges:Parameters<HandleProps['isValidConnection']>[0],edgeType:'source'|'target',nodeType:string)=>boolean
}
export interface FlowProps {
initialValues?: {
Expand Down Expand Up @@ -167,6 +167,7 @@ export interface FlowProps {
* 节点配置
*/
settings?: (TNodeGroup | TNodeItem)[];
filterSettings?:(settings:(TNodeGroup | TNodeItem)[],nodeType:string)=>(TNodeGroup | TNodeItem)[]
nodeSelector?: TNodeSelector;
iconFontUrl?: string;
globalConfig?: {
Expand Down
2 changes: 2 additions & 0 deletions packages/x-flow/src/withProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export default function withProvider<T>(
clickAddNode,
onTesting,
openColorfulMode,
filterSettings,
...restProps
} = props;
const settingMap = useMemo(() => {
Expand Down Expand Up @@ -65,6 +66,7 @@ export default function withProvider<T>(
clickAddNode,
onTesting,
openColorfulMode,
filterSettings,
widgets: {
...defaultWidgets,
...widgets,
Expand Down
Loading