Skip to content

Commit 750bf69

Browse files
authored
Merge pull request #1706 from jile1997/feat
feat: 部分优化
2 parents eb13239 + 49a104e commit 750bf69

File tree

8 files changed

+59
-25
lines changed

8 files changed

+59
-25
lines changed

packages/x-flow/src/XFlow.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ const XFlow: FC<FlowProps> = memo(props => {
176176
isAddingNode: false,
177177
});
178178
}
179+
} else if (e.key === 'Escape'){
180+
setOpenPanel(false)
179181
}
180182
});
181183

packages/x-flow/src/components/CustomNode/index.tsx

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,30 @@ export default memo((props: any) => {
277277
};
278278
}, [menuItem, isEnd]);
279279

280+
const renderHandleMemo = useCallback(()=>{
281+
if(renderHandle){
282+
return renderHandle(
283+
SourceHandle,
284+
{
285+
position:sourcePosition,
286+
isConnectable:connectable,
287+
selected:selected,
288+
isHovered:isHovered,
289+
handleAddNode:handleAddNode
290+
},
291+
{
292+
id,
293+
type,
294+
data,
295+
layout,
296+
isConnectable,
297+
readOnly
298+
}
299+
)
300+
}
301+
return null
302+
},[renderHandle,SourceHandle,sourcePosition,connectable,selected,isHovered,handleAddNode,id,type,data,layout,isConnectable,readOnly])
303+
280304
return (
281305
<div
282306
className={classNames('xflow-node-container', {
@@ -292,7 +316,12 @@ export default memo((props: any) => {
292316
>
293317
{!settingMap?.[type]?.targetHandleHidden && !isNote && (
294318
<Handle
295-
{...handleProps}
319+
isValidConnection={(edge)=>{
320+
if(handleProps.isValidConnection){
321+
return handleProps.isValidConnection(edge,'target',type)
322+
}
323+
return true
324+
}}
296325
type="target"
297326
position={targetPosition}
298327
isConnectable={connectable}
@@ -333,24 +362,7 @@ export default memo((props: any) => {
333362
<div onClick={()=>{
334363
onClick(data)
335364
}}>
336-
{renderHandle(
337-
SourceHandle,
338-
{
339-
position:sourcePosition,
340-
isConnectable:connectable,
341-
selected:selected,
342-
isHovered:isHovered,
343-
handleAddNode:handleAddNode
344-
},
345-
{
346-
id,
347-
type,
348-
data,
349-
layout,
350-
isConnectable,
351-
readOnly
352-
}
353-
)}
365+
{renderHandleMemo()}
354366
</div>
355367
:
356368
<Fragment>
@@ -363,6 +375,7 @@ export default memo((props: any) => {
363375
isHovered={isHovered}
364376
handleAddNode={handleAddNode}
365377
isConnected={isSourceHandleConnected}
378+
nodeType={type}
366379
// isConnectableStart={isConnectableStart}
367380
// isConnectableEnd={isConnectableEnd}
368381
/>

packages/x-flow/src/components/CustomNode/sourceHandle.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { PlusOutlined } from '@ant-design/icons';
22
import { Handle } from '@xyflow/react';
33
import { Tooltip } from 'antd';
44
import classNames from 'classnames';
5-
import React, { ComponentProps, memo, useContext, useMemo, useRef, useState } from 'react';
5+
import React, { ComponentProps, memo, useContext, useEffect, useMemo, useRef, useState } from 'react';
66
import NodeSelectPopover from '../NodesPopover';
77
import { ConfigContext } from '../../models/context';
88
import './index.less';
@@ -18,6 +18,7 @@ export default memo((props:Partial<HandleProps> & Record<string,any> ) => {
1818
handleAddNode,
1919
switchTitle,
2020
isConnected, // 是否有连接的节点
21+
nodeType,
2122
...rest
2223
} = props;
2324
const [isShowTooltip, setIsShowTooltip] = useState(false);
@@ -40,7 +41,12 @@ export default memo((props:Partial<HandleProps> & Record<string,any> ) => {
4041

4142
return (
4243
<Handle
43-
{...handleProps}
44+
isValidConnection={(edge)=>{
45+
if(handleProps.isValidConnection){
46+
return handleProps.isValidConnection(edge,'source',nodeType)
47+
}
48+
return true
49+
}}
4450
type="source"
4551
position={position}
4652
isConnectable={isConnectable}
@@ -72,6 +78,7 @@ export default memo((props:Partial<HandleProps> & Record<string,any> ) => {
7278
addNode={handleAddNode}
7379
ref={popoverRef}
7480
onNodeSelectPopoverChange={val => setOpenNodeSelectPopover(val)}
81+
nodeType={nodeType}
7582
>
7683
<Tooltip
7784
title="点击添加节点"

packages/x-flow/src/components/NodesPopover/index.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,21 @@ import NodesMenu from '../NodesMenu';
1717
import './index.less';
1818

1919
export default forwardRef((props: any, popoverRef) => {
20-
const { addNode, children, onNodeSelectPopoverChange } = props;
20+
const { addNode, children, onNodeSelectPopoverChange,nodeType } = props;
2121
const { setIsAddingNode } = useStore(s => ({
2222
setIsAddingNode: s.setIsAddingNode,
2323
}));
2424
const ref = useRef<any>(null);
2525
const closeRef: any = useRef<HTMLButtonElement>(null);
2626
const [open, setOpen] = useState(false);
2727

28-
const { settings, nodeSelector, antdVersion ,readOnly ,clickAddNode,settingMap }: any = useContext(ConfigContext);
28+
const { settings, nodeSelector, antdVersion ,readOnly ,clickAddNode,settingMap,filterSettings }: any = useContext(ConfigContext);
29+
const items = useMemo(()=>{
30+
if(typeof filterSettings === 'function'){
31+
return filterSettings(settings,nodeType)
32+
}
33+
return settings
34+
},[settings,nodeType])
2935
const { showSearch, popoverProps = { placement: 'top' } } =
3036
nodeSelector || {};
3137

@@ -97,7 +103,7 @@ export default forwardRef((props: any, popoverRef) => {
97103
content={
98104
<NodesMenu
99105
ref={ref}
100-
items={settings}
106+
items={items}
101107
showSearch={showSearch}
102108
onClick={handCreateNode}
103109
/>

packages/x-flow/src/nodes/node-parallel/ParallelBuildInNodeWidget.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export default memo((props: any) => {
6969
(edges || [])?.filter(flow => flow?.sourceHandle === item?._id)
7070
?.length > 0
7171
}
72+
nodeType={'Parallel'}
7273
/>
7374
</div>
7475
);

packages/x-flow/src/nodes/node-switch/SwitchBuildInNodeWidget.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export default memo((props: any) => {
5656
(edges || [])?.filter(flow => flow?.sourceHandle === item?._id)
5757
?.length > 0
5858
}
59+
nodeType={'switch'}
5960
/>
6061
</div>
6162
);
@@ -140,6 +141,7 @@ export default memo((props: any) => {
140141
flow?.sourceHandle === 'id_else' && flow?.source === id
141142
)?.length > 0
142143
}
144+
nodeType={'Switch'}
143145
/>
144146
</div>
145147
</div>

packages/x-flow/src/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ export interface TControl{
139139
export interface THandle{
140140
// isConnectableStart?:boolean
141141
// isConnectableEnd?:boolean
142-
isValidConnection?:HandleProps['isValidConnection']
142+
isValidConnection?:(edges:Parameters<HandleProps['isValidConnection']>[0],edgeType:'source'|'target',nodeType:string)=>boolean
143143
}
144144
export interface FlowProps {
145145
initialValues?: {
@@ -167,6 +167,7 @@ export interface FlowProps {
167167
* 节点配置
168168
*/
169169
settings?: (TNodeGroup | TNodeItem)[];
170+
filterSettings?:(settings:(TNodeGroup | TNodeItem)[],nodeType:string)=>(TNodeGroup | TNodeItem)[]
170171
nodeSelector?: TNodeSelector;
171172
iconFontUrl?: string;
172173
globalConfig?: {

packages/x-flow/src/withProvider.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export default function withProvider<T>(
3535
clickAddNode,
3636
onTesting,
3737
openColorfulMode,
38+
filterSettings,
3839
...restProps
3940
} = props;
4041
const settingMap = useMemo(() => {
@@ -65,6 +66,7 @@ export default function withProvider<T>(
6566
clickAddNode,
6667
onTesting,
6768
openColorfulMode,
69+
filterSettings,
6870
widgets: {
6971
...defaultWidgets,
7072
...widgets,

0 commit comments

Comments
 (0)