fix(core): workflow document reload addNode api (#353)

This commit is contained in:
Louis Young 2025-06-10 15:47:19 +08:00 committed by GitHub
parent 004b8ac8bd
commit 73b2090bd3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 86 additions and 19 deletions

View File

@ -226,12 +226,7 @@ export class FlowDocument<T = FlowDocumentJSON> implements Disposable {
* @param data
* @param addedNodes
*/
addNode(
data: AddNodeData,
addedNodes?: FlowNodeEntity[],
ignoreCreateAndUpdateEvent?: boolean,
ignoreBlocks?: boolean
): FlowNodeEntity {
addNode(data: AddNodeData, addedNodes?: FlowNodeEntity[]): FlowNodeEntity {
const { id, type = 'block', originParent, parent, meta, hidden, index } = data;
let node = this.getNode(id);
let isNew = false;
@ -279,7 +274,7 @@ export class FlowDocument<T = FlowDocumentJSON> implements Disposable {
if (extendNodes && addedNodes) {
addedNodes.push(...extendNodes);
}
} else if (data.blocks && data.blocks.length > 0 && !ignoreBlocks) {
} else if (data.blocks && data.blocks.length > 0) {
// 兼容老的写法
if (!data.blocks[0].type) {
this.addInlineBlocks(node, data.blocks, addedNodes);
@ -288,7 +283,6 @@ export class FlowDocument<T = FlowDocumentJSON> implements Disposable {
}
}
if (!ignoreCreateAndUpdateEvent) {
if (isNew) {
this.onNodeCreateEmitter.fire({
node,
@ -298,7 +292,6 @@ export class FlowDocument<T = FlowDocumentJSON> implements Disposable {
} else {
this.onNodeUpdateEmitter.fire({ node, data, json: data });
}
}
return node;
}

View File

@ -2,7 +2,12 @@ import { customAlphabet } from 'nanoid';
import { inject, injectable, optional, postConstruct } from 'inversify';
import { Emitter, type IPoint } from '@flowgram.ai/utils';
import { NodeEngineContext } from '@flowgram.ai/form-core';
import { FlowDocument, FlowNodeBaseType, FlowNodeTransformData } from '@flowgram.ai/document';
import {
AddNodeData,
FlowDocument,
FlowNodeBaseType,
FlowNodeTransformData,
} from '@flowgram.ai/document';
import {
injectPlaygroundContext,
PlaygroundConfigEntity,
@ -170,7 +175,6 @@ export class WorkflowDocument extends FlowDocument {
parent,
},
undefined,
true,
true
) as WorkflowNodeEntity;
@ -293,6 +297,76 @@ export class WorkflowDocument extends FlowDocument {
return node;
}
/**
*
* @param data
* @param addedNodes
*/
addNode(
data: AddNodeData,
addedNodes?: WorkflowNodeEntity[],
ignoreCreateAndUpdateEvent?: boolean
): WorkflowNodeEntity {
const { id, type = 'block', originParent, parent, meta, hidden, index } = data;
let node = this.getNode(id);
let isNew = false;
const register = this.getNodeRegistry(type, data.originParent);
// node 类型变化则全部删除重新来
if (node && node.flowNodeType !== data.type) {
node.dispose();
node = undefined;
}
if (!node) {
const { dataRegistries } = register;
node = this.entityManager.createEntity<WorkflowNodeEntity>(WorkflowNodeEntity, {
id,
document: this,
flowNodeType: type,
originParent,
meta,
});
const datas = dataRegistries
? this.nodeDataRegistries.concat(...dataRegistries)
: this.nodeDataRegistries;
node.addInitializeData(datas);
node.onDispose(() => this.onNodeDisposeEmitter.fire({ node: node! }));
this.options.fromNodeJSON?.(node, data, true);
isNew = true;
} else {
this.options.fromNodeJSON?.(node, data, false);
}
// 初始化数据重制
node.initData({
originParent,
parent,
meta,
hidden,
index,
});
addedNodes?.push(node);
// 自定义创建逻辑
if (register.onCreate) {
const extendNodes = register.onCreate(node, data);
if (extendNodes && addedNodes) {
addedNodes.push(...extendNodes);
}
}
if (!ignoreCreateAndUpdateEvent) {
if (isNew) {
this.onNodeCreateEmitter.fire({
node,
data,
json: data,
});
} else {
this.onNodeUpdateEmitter.fire({ node, data, json: data });
}
}
return node;
}
get layout(): FreeLayout {
const layout = this.layouts.find((layout) => layout.name == this.currentLayoutKey);
if (!layout) {