@@ -2,7 +2,12 @@ import { customAlphabet } from 'nanoid';
22import { inject , injectable , optional , postConstruct } from 'inversify' ;
33import { Emitter , type IPoint } from '@flowgram.ai/utils' ;
44import { 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' ;
611import {
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