Skip to content

Commit efcbaae

Browse files
authored
Merge pull request #1713 from jile1997/feat
feat: 部分优化
2 parents 17d2cb4 + c99f49f commit efcbaae

File tree

5 files changed

+55
-9
lines changed

5 files changed

+55
-9
lines changed

packages/x-flow/src/XFlow.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,8 @@ const XFlow: FC<FlowProps> = memo(props => {
164164
copyNode(selectedNode.id);
165165
}
166166
} else if ((e.key === 'v' || e.key === 'V') && (e.ctrlKey || e.metaKey)) {
167-
const { copyNodes } = storeApi.getState();
168-
if (copyNodes?.length > 0) {
169-
e.preventDefault();
170-
pasteNodeSimple();
171-
}
167+
e.preventDefault();
168+
pasteNodeSimple();
172169
} else if (e.key === 'Escape') {
173170
setOpenPanel(false);
174171
workflowContainerRef.current?.focus();
@@ -327,6 +324,7 @@ const XFlow: FC<FlowProps> = memo(props => {
327324
}, [activeNode?.id]);
328325

329326
const deletable = globalConfig?.edge?.deletable ?? true;
327+
const strokeWidth = globalConfig?.edge?.strokeWidth ?? 1.5
330328
const panelonClose = globalConfig?.nodePanel?.onClose;
331329

332330
return (
@@ -352,7 +350,7 @@ const XFlow: FC<FlowProps> = memo(props => {
352350
defaultEdgeOptions={{
353351
type: 'buttonedge',
354352
style: {
355-
strokeWidth: 1.5, // 线粗细
353+
strokeWidth, // 线粗细
356354
},
357355
markerEnd: {
358356
type: MarkerType.ArrowClosed, // 箭头

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ const NodeEditor: FC<INodeEditorProps> = forwardRef((props, ref: any) => {
152152
setCustomVal(values);
153153
handleNodeValueChange({ ...values });
154154
}}
155+
nodeId={id}
155156
readOnly={readOnly}
156157
ref={nodeWidgetRef}
157158
/>
@@ -163,6 +164,9 @@ const NodeEditor: FC<INodeEditorProps> = forwardRef((props, ref: any) => {
163164
form={form}
164165
widgets={widgets}
165166
watch={watch}
167+
globalProps={{
168+
nodeId:id
169+
}}
166170
readOnly={readOnly}
167171
onMount={() => {
168172
const initialValues = form.getValues();
@@ -184,6 +188,9 @@ const NodeEditor: FC<INodeEditorProps> = forwardRef((props, ref: any) => {
184188
widgets={widgets}
185189
watch={watch}
186190
size={'small'}
191+
globalProps={{
192+
nodeId:id
193+
}}
187194
readOnly={readOnly}
188195
configProvider={{
189196
getPopupContainer: triggerNode => triggerNode.parentElement,
@@ -198,6 +205,7 @@ const NodeEditor: FC<INodeEditorProps> = forwardRef((props, ref: any) => {
198205
handleNodeValueChange({ ...val });
199206
}}
200207
value={data}
208+
nodeId={id}
201209
readOnly={readOnly}
202210
/>
203211
);

packages/x-flow/src/hooks/useFlow.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { FlowNode } from '../models/store';
66
import { useStoreApi } from './useStore';
77
import { useTemporalStore } from './useTemporalStore';
88
import autoLayoutNodes from '../utils/autoLayoutNodes';
9-
import { generateCopyNodes, uuid } from '../utils';
9+
import { generateCopyNodes, safeJSONParse, safeJsonStringify, uuid } from '../utils';
1010
import { message } from 'antd';
1111

1212
// useFlow 维护原则
@@ -113,6 +113,11 @@ export const useFlow = () => {
113113
storeApi.setState({ copyTimeoutId: null });
114114
}, 30000);
115115

116+
navigator.clipboard
117+
.writeText(safeJsonStringify(copyNodes))
118+
.catch((err) => {
119+
message.error('复制失败~');
120+
})
116121
storeApi.setState({
117122
copyNodes,
118123
copyTimeoutId: timeoutId,
@@ -148,8 +153,9 @@ export const useFlow = () => {
148153
}
149154
});
150155

151-
const pasteNodeSimple = useMemoizedFn(() => {
156+
const pasteNodeSimple = useMemoizedFn(async() => {
152157
const mousePosition = storeApi.getState().mousePosition;
158+
const text = await navigator.clipboard.readText().catch(()=>null)
153159
if (storeApi.getState().copyNodes.length > 0) {
154160
// 清除超时定时器
155161
if (storeApi.getState().copyTimeoutId) {
@@ -178,7 +184,24 @@ export const useFlow = () => {
178184
copyTimeoutId: null,
179185
});
180186
});
181-
} else {
187+
} else if(text){
188+
const copyNodeData = safeJSONParse(text,[])
189+
const flowPos = screenToFlowPosition({
190+
x: mousePosition.elementX,
191+
y: mousePosition.elementY,
192+
});
193+
const copyNodes = copyNodeData.map(node => ({
194+
...node,
195+
id:uuid(),
196+
position: {
197+
x: flowPos.x,
198+
y: flowPos.y,
199+
},
200+
}));
201+
record(() => {
202+
storeApi.getState().addNodes(copyNodes, false);
203+
});
204+
}else{
182205
// message.warning('请先复制节点!');
183206
}
184207
});

packages/x-flow/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ export interface TEdge {
125125
hideEdgeAddBtn?: boolean; // 是否隐藏两个节点之间,连线上的增加节点按钮
126126
hideEdgeDelBtn?: boolean; // 是否隐藏两个节点之间,连线上的删除节点按钮
127127
deletable?: boolean; // 是否允许删除线条 初始化的edges不受此项影响
128+
129+
strokeWidth?:number
128130
}
129131

130132
export interface TControl{

packages/x-flow/src/utils/index.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,21 @@ export function safeJsonStringify(obj: Object) {
281281
}
282282
}
283283

284+
export function safeJSONParse<T = any>(
285+
jsonString: string | null,
286+
defaultVal: T = {} as any,
287+
): T {
288+
if (typeof jsonString === 'string') {
289+
try {
290+
return JSON.parse(jsonString);
291+
} catch (e) {
292+
return defaultVal; // 或返回默认值 {}
293+
}
294+
} else {
295+
return defaultVal;
296+
}
297+
}
298+
284299
export * from './flow';
285300

286301
// 内置节点状态

0 commit comments

Comments
 (0)