Skip to content

Commit 73b2090

Browse files
authored
fix(core): workflow document reload addNode api (bytedance#353)
1 parent 004b8ac commit 73b2090

File tree

2 files changed

+86
-19
lines changed

2 files changed

+86
-19
lines changed

packages/canvas-engine/document/src/flow-document.ts

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -226,12 +226,7 @@ export class FlowDocument<T = FlowDocumentJSON> implements Disposable {
226226
* @param data
227227
* @param addedNodes
228228
*/
229-
addNode(
230-
data: AddNodeData,
231-
addedNodes?: FlowNodeEntity[],
232-
ignoreCreateAndUpdateEvent?: boolean,
233-
ignoreBlocks?: boolean
234-
): FlowNodeEntity {
229+
addNode(data: AddNodeData, addedNodes?: FlowNodeEntity[]): FlowNodeEntity {
235230
const { id, type = 'block', originParent, parent, meta, hidden, index } = data;
236231
let node = this.getNode(id);
237232
let isNew = false;
@@ -279,7 +274,7 @@ export class FlowDocument<T = FlowDocumentJSON> implements Disposable {
279274
if (extendNodes && addedNodes) {
280275
addedNodes.push(...extendNodes);
281276
}
282-
} else if (data.blocks && data.blocks.length > 0 && !ignoreBlocks) {
277+
} else if (data.blocks && data.blocks.length > 0) {
283278
// 兼容老的写法
284279
if (!data.blocks[0].type) {
285280
this.addInlineBlocks(node, data.blocks, addedNodes);
@@ -288,16 +283,14 @@ export class FlowDocument<T = FlowDocumentJSON> implements Disposable {
288283
}
289284
}
290285

291-
if (!ignoreCreateAndUpdateEvent) {
292-
if (isNew) {
293-
this.onNodeCreateEmitter.fire({
294-
node,
295-
data,
296-
json: data,
297-
});
298-
} else {
299-
this.onNodeUpdateEmitter.fire({ node, data, json: data });
300-
}
286+
if (isNew) {
287+
this.onNodeCreateEmitter.fire({
288+
node,
289+
data,
290+
json: data,
291+
});
292+
} else {
293+
this.onNodeUpdateEmitter.fire({ node, data, json: data });
301294
}
302295

303296
return node;

packages/canvas-engine/free-layout-core/src/workflow-document.ts

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import { customAlphabet } from 'nanoid';
22
import { inject, injectable, optional, postConstruct } from 'inversify';
33
import { Emitter, type IPoint } from '@flowgram.ai/utils';
44
import { NodeEngineContext } from '@flowgram.ai/form-core';
5-
import { FlowDocument, FlowNodeBaseType, FlowNodeTransformData } from '@flowgram.ai/document';
5+
import {
6+
AddNodeData,
7+
FlowDocument,
8+
FlowNodeBaseType,
9+
FlowNodeTransformData,
10+
} from '@flowgram.ai/document';
611
import {
712
injectPlaygroundContext,
813
PlaygroundConfigEntity,
@@ -170,7 +175,6 @@ export class WorkflowDocument extends FlowDocument {
170175
parent,
171176
},
172177
undefined,
173-
true,
174178
true
175179
) as WorkflowNodeEntity;
176180

@@ -293,6 +297,76 @@ export class WorkflowDocument extends FlowDocument {
293297
return node;
294298
}
295299

300+
/**
301+
* 添加节点,如果节点已经存在则不会重复创建
302+
* @param data
303+
* @param addedNodes
304+
*/
305+
addNode(
306+
data: AddNodeData,
307+
addedNodes?: WorkflowNodeEntity[],
308+
ignoreCreateAndUpdateEvent?: boolean
309+
): WorkflowNodeEntity {
310+
const { id, type = 'block', originParent, parent, meta, hidden, index } = data;
311+
let node = this.getNode(id);
312+
let isNew = false;
313+
const register = this.getNodeRegistry(type, data.originParent);
314+
// node 类型变化则全部删除重新来
315+
if (node && node.flowNodeType !== data.type) {
316+
node.dispose();
317+
node = undefined;
318+
}
319+
if (!node) {
320+
const { dataRegistries } = register;
321+
node = this.entityManager.createEntity<WorkflowNodeEntity>(WorkflowNodeEntity, {
322+
id,
323+
document: this,
324+
flowNodeType: type,
325+
originParent,
326+
meta,
327+
});
328+
const datas = dataRegistries
329+
? this.nodeDataRegistries.concat(...dataRegistries)
330+
: this.nodeDataRegistries;
331+
node.addInitializeData(datas);
332+
node.onDispose(() => this.onNodeDisposeEmitter.fire({ node: node! }));
333+
this.options.fromNodeJSON?.(node, data, true);
334+
isNew = true;
335+
} else {
336+
this.options.fromNodeJSON?.(node, data, false);
337+
}
338+
// 初始化数据重制
339+
node.initData({
340+
originParent,
341+
parent,
342+
meta,
343+
hidden,
344+
index,
345+
});
346+
addedNodes?.push(node);
347+
// 自定义创建逻辑
348+
if (register.onCreate) {
349+
const extendNodes = register.onCreate(node, data);
350+
if (extendNodes && addedNodes) {
351+
addedNodes.push(...extendNodes);
352+
}
353+
}
354+
355+
if (!ignoreCreateAndUpdateEvent) {
356+
if (isNew) {
357+
this.onNodeCreateEmitter.fire({
358+
node,
359+
data,
360+
json: data,
361+
});
362+
} else {
363+
this.onNodeUpdateEmitter.fire({ node, data, json: data });
364+
}
365+
}
366+
367+
return node;
368+
}
369+
296370
get layout(): FreeLayout {
297371
const layout = this.layouts.find((layout) => layout.name == this.currentLayoutKey);
298372
if (!layout) {

0 commit comments

Comments
 (0)