@flowgram.ai/free-layout-core 0.4.16 → 0.4.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -2,10 +2,8 @@ import { PlaygroundConfigEntity, CommandService, PlaygroundDragEvent, EntityData
2
2
  export { bindConfigEntity, useConfigEntity, useEntities, useEntityDataFromContext, useEntityFromContext, useListenEvents, usePlayground, usePlaygroundContainer, usePlaygroundContext, useRefresh, useService } from '@flowgram.ai/core';
3
3
  import { NodeFormProps } from '@flowgram.ai/node';
4
4
  import { FlowOperationBaseService, FlowNodeType, FlowOperationBaseServiceImpl, FlowNodeEntityOrId, FlowNodeEntity } from '@flowgram.ai/document';
5
- import { W as WorkflowHoverService, a as WorkflowDocument, b as WorkflowLinesManager, c as WorkflowSelectService, d as WorkflowDocumentOptions, L as LineEventProps, N as NodesDragEvent, e as WorkflowNodeJSON, f as WorkflowPortEntity, g as WorkflowLineEntity, O as OnDragLineEnd, h as WorkflowJSON, i as LineCenterPoint, j as WorkflowPorts, k as WorkflowPortType, l as LinePoint, m as WorkflowPort, n as LineRenderType, o as WorkflowLineRenderContribution, p as LinePosition } from './workflow-line-entity-IbhMSbBs.mjs';
6
- export { R as HoverPosition, F as LINE_HOVER_DISTANCE, y as LineColor, z as LineColors, x as LinePointLocation, w as LineType, C as NodesDragEndEvent, B as NodesDragStartEvent, D as NodesDraggingEvent, P as POINT_RADIUS, K as PORT_SIZE, r as WORKFLOW_LINE_ENTITY, S as WorkfloEntityHoverable, u as WorkflowContentChangeEvent, t as WorkflowContentChangeType, U as WorkflowDocumentOptionsDefault, T as WorkflowDocumentProvider, Q as WorkflowEntityHoverable, H as WorkflowLineEntityOpts, I as WorkflowLineInfo, G as WorkflowLinePortInfo, A as WorkflowLineRenderContributionFactory, J as WorkflowLineUIState, v as WorkflowNodeMeta, M as WorkflowPortEntityOpts, s as domReactToBounds, q as getPortEntityId, E as onDragLineEndParams } from './workflow-line-entity-IbhMSbBs.mjs';
7
- import { W as WorkflowNodeEntity } from './workflow-sub-canvas-IQzlYvPD.mjs';
8
- export { a as WorkflowSubCanvas } from './workflow-sub-canvas-IQzlYvPD.mjs';
5
+ import { W as WorkflowHoverService, a as WorkflowDocument, b as WorkflowLinesManager, c as WorkflowSelectService, d as WorkflowDocumentOptions, L as LineEventProps, N as NodesDragEvent, e as WorkflowNodeJSON, f as WorkflowNodeEntity, g as WorkflowPortEntity, h as WorkflowLineEntity, O as OnDragLineEnd, i as LineRenderType, j as WorkflowLineRenderContribution, k as LinePosition, l as LineCenterPoint, m as WorkflowJSON } from './workflow-node-entity-DtPEYn6-.mjs';
6
+ export { X as HoverPosition, F as LINE_HOVER_DISTANCE, x as LineColor, y as LineColors, w as LinePoint, v as LinePointLocation, u as LineType, C as NodesDragEndEvent, B as NodesDragStartEvent, D as NodesDraggingEvent, P as POINT_RADIUS, K as PORT_SIZE, p as WORKFLOW_LINE_ENTITY, Y as WorkfloEntityHoverable, s as WorkflowContentChangeEvent, r as WorkflowContentChangeType, _ as WorkflowDocumentOptionsDefault, Z as WorkflowDocumentProvider, V as WorkflowEntityHoverable, H as WorkflowLineEntityOpts, I as WorkflowLineInfo, G as WorkflowLinePortInfo, z as WorkflowLineRenderContributionFactory, J as WorkflowLineUIState, T as WorkflowNodeLines, U as WorkflowNodeLinesData, t as WorkflowNodeMeta, S as WorkflowNodePortsData, M as WorkflowPort, R as WorkflowPortEntityOpts, n as WorkflowPortType, Q as WorkflowPorts, A as WorkflowSubCanvas, q as domReactToBounds, o as getPortEntityId, E as onDragLineEndParams } from './workflow-node-entity-DtPEYn6-.mjs';
9
7
  import * as _flowgram_ai_utils from '@flowgram.ai/utils';
10
8
  import { DisposableCollection, IPoint, Disposable, Rectangle } from '@flowgram.ai/utils';
11
9
  export { compose, composeAsync, delay } from '@flowgram.ai/utils';
@@ -116,6 +114,10 @@ declare class WorkflowDragService {
116
114
  private clearDrop;
117
115
  private setLineColor;
118
116
  private handleDragOnNode;
117
+ /**
118
+ * 容器内子节点总体位置重置为0
119
+ */
120
+ private resetContainerInternalPosition;
119
121
  private childrenOfContainer;
120
122
  /**
121
123
  * 绘制线条
@@ -191,6 +193,46 @@ declare class WorkflowOperationBaseServiceImpl extends FlowOperationBaseServiceI
191
193
  updateNodePosition(nodeOrId: FlowNodeEntityOrId, position: IPoint): void;
192
194
  }
193
195
 
196
+ /**
197
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
198
+ * SPDX-License-Identifier: MIT
199
+ */
200
+
201
+ interface WorkflowLineRenderDataSchema {
202
+ version: string;
203
+ contributions: Map<LineRenderType, WorkflowLineRenderContribution>;
204
+ position: LinePosition;
205
+ }
206
+ declare class WorkflowLineRenderData extends EntityData<WorkflowLineRenderDataSchema> {
207
+ static type: string;
208
+ entity: WorkflowLineEntity;
209
+ constructor(entity: WorkflowLineEntity);
210
+ getDefaultData(): WorkflowLineRenderDataSchema;
211
+ get renderVersion(): string;
212
+ get position(): LinePosition;
213
+ get path(): string;
214
+ calcDistance(pos: IPoint): number;
215
+ get bounds(): Rectangle;
216
+ /**
217
+ * 更新数据
218
+ * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
219
+ */
220
+ update(): void;
221
+ private get lineType();
222
+ /**
223
+ * 获取 center 位置
224
+ */
225
+ get center(): LineCenterPoint;
226
+ /**
227
+ * 更新版本
228
+ * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
229
+ */
230
+ private updatePosition;
231
+ private get currentLine();
232
+ private syncContributions;
233
+ private registerContribution;
234
+ }
235
+
194
236
  /**
195
237
  * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
196
238
  * SPDX-License-Identifier: MIT
@@ -377,184 +419,6 @@ declare enum InteractiveType {
377
419
  PAD = "PAD"
378
420
  }
379
421
 
380
- /**
381
- * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
382
- * SPDX-License-Identifier: MIT
383
- */
384
-
385
- /**
386
- * 节点的点位信息
387
- * portsData 只监听点位的数目和类型,不监听点位的 position 变化
388
- */
389
- declare class WorkflowNodePortsData extends EntityData {
390
- static readonly type = "WorkflowNodePortsData";
391
- readonly entity: WorkflowNodeEntity;
392
- /** 静态的 ports 数据 */
393
- protected _staticPorts: WorkflowPorts;
394
- /** 存储 port 实体的 id,用于判断 port 是否存在 */
395
- protected _portIDSet: Set<string>;
396
- /** 上一次的 ports 数据,用于判断 ports 是否发生变化 */
397
- protected _prePorts: WorkflowPorts;
398
- constructor(entity: WorkflowNodeEntity);
399
- getDefaultData(): any;
400
- /**
401
- * Update all ports data, includes static ports and dynamic ports
402
- * @param ports
403
- */
404
- updateAllPorts(ports?: WorkflowPorts): void;
405
- /**
406
- * @deprecated use `updateAllPorts` instead
407
- */
408
- updateStaticPorts(ports: WorkflowPorts): void;
409
- /**
410
- * 动态计算点位,通过 dom 的 data-port-key
411
- */
412
- updateDynamicPorts(): void;
413
- /**
414
- * 根据 key 获取 port 实体
415
- */
416
- getPortEntityByKey(portType: WorkflowPortType, portKey?: string | number): WorkflowPortEntity;
417
- /**
418
- * 更新 ports 数据
419
- */
420
- protected updatePorts(ports: WorkflowPorts): void;
421
- /**
422
- * 获取所有 port entities
423
- */
424
- get allPorts(): WorkflowPortEntity[];
425
- /**
426
- * 获取输入点位
427
- */
428
- get inputPorts(): WorkflowPortEntity[];
429
- /**
430
- * 获取输出点位
431
- */
432
- get outputPorts(): WorkflowPortEntity[];
433
- /**
434
- * 获取输入点位置
435
- */
436
- get inputPoints(): LinePoint[];
437
- /**
438
- * 获取输出点位置
439
- */
440
- get outputPoints(): LinePoint[];
441
- /**
442
- * 根据 key 获取 输入点位置
443
- */
444
- getInputPoint(key?: string | number): LinePoint;
445
- /**
446
- * 根据 key 获取输出点位置
447
- */
448
- getOutputPoint(key?: string | number): LinePoint;
449
- /**
450
- * 获取 port 实体
451
- */
452
- protected getPortEntity(portId: string): WorkflowPortEntity | undefined;
453
- /**
454
- * 拼接 port 实体的 id
455
- */
456
- protected getPortId(portType: WorkflowPortType, portKey?: string | number): string;
457
- /**
458
- * 创建 port 实体
459
- */
460
- protected createPortEntity(portInfo: WorkflowPort): WorkflowPortEntity;
461
- /**
462
- * 获取或创建 port 实体
463
- */
464
- protected getOrCreatePortEntity(portInfo: WorkflowPort): WorkflowPortEntity;
465
- /**
466
- * 更新 port 实体
467
- */
468
- protected updatePortEntity(portInfo: WorkflowPort): WorkflowPortEntity;
469
- }
470
-
471
- /**
472
- * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
473
- * SPDX-License-Identifier: MIT
474
- */
475
-
476
- interface WorkflowNodeLines {
477
- inputLines: WorkflowLineEntity[];
478
- outputLines: WorkflowLineEntity[];
479
- }
480
- /**
481
- * 节点的关联的线条
482
- */
483
- declare class WorkflowNodeLinesData extends EntityData<WorkflowNodeLines> {
484
- static type: string;
485
- entity: WorkflowNodeEntity;
486
- getDefaultData(): WorkflowNodeLines;
487
- constructor(entity: WorkflowNodeEntity);
488
- /**
489
- * 输入线条
490
- */
491
- get inputLines(): WorkflowLineEntity[];
492
- /**
493
- * 输出线条
494
- */
495
- get outputLines(): WorkflowLineEntity[];
496
- get allLines(): WorkflowLineEntity[];
497
- get availableLines(): WorkflowLineEntity[];
498
- /**
499
- * 输入节点
500
- */
501
- get inputNodes(): WorkflowNodeEntity[];
502
- /**
503
- * 所有输入节点
504
- */
505
- get allInputNodes(): WorkflowNodeEntity[];
506
- /**
507
- * 输出节点
508
- */
509
- get outputNodes(): WorkflowNodeEntity[];
510
- /**
511
- * 输入输出节点
512
- */
513
- get allOutputNodes(): WorkflowNodeEntity[];
514
- addLine(line: WorkflowLineEntity): void;
515
- removeLine(line: WorkflowLineEntity): void;
516
- }
517
-
518
- /**
519
- * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
520
- * SPDX-License-Identifier: MIT
521
- */
522
-
523
- interface WorkflowLineRenderDataSchema {
524
- version: string;
525
- contributions: Map<LineRenderType, WorkflowLineRenderContribution>;
526
- position: LinePosition;
527
- }
528
- declare class WorkflowLineRenderData extends EntityData<WorkflowLineRenderDataSchema> {
529
- static type: string;
530
- entity: WorkflowLineEntity;
531
- constructor(entity: WorkflowLineEntity);
532
- getDefaultData(): WorkflowLineRenderDataSchema;
533
- get renderVersion(): string;
534
- get position(): LinePosition;
535
- get path(): string;
536
- calcDistance(pos: IPoint): number;
537
- get bounds(): Rectangle;
538
- /**
539
- * 更新数据
540
- * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
541
- */
542
- update(): void;
543
- private get lineType();
544
- /**
545
- * 获取 center 位置
546
- */
547
- get center(): LineCenterPoint;
548
- /**
549
- * 更新版本
550
- * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
551
- */
552
- private updatePosition;
553
- private get currentLine();
554
- private syncContributions;
555
- private registerContribution;
556
- }
557
-
558
422
  /**
559
423
  * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
560
424
  * SPDX-License-Identifier: MIT
@@ -562,4 +426,4 @@ declare class WorkflowLineRenderData extends EntityData<WorkflowLineRenderDataSc
562
426
 
563
427
  declare const WorkflowDocumentContainerModule: ContainerModule;
564
428
 
565
- export { EditorCursorState, InteractiveType, LineCenterPoint, LineEventProps, LinePoint, LinePosition, LineRenderType, NodePostionUpdateEvent, type NodeRenderReturnType, NodesDragEvent, OnDragLineEnd, type PositionMap, WorkflowCommands, WorkflowDocument, WorkflowDocumentContainerModule, WorkflowDocumentOptions, WorkflowDragService, WorkflowHoverService, WorkflowJSON, WorkflowLineEntity, WorkflowLineRenderContribution, WorkflowLineRenderData, type WorkflowLineRenderDataSchema, WorkflowLinesManager, WorkflowNodeEntity, WorkflowNodeJSON, type WorkflowNodeLines, WorkflowNodeLinesData, WorkflowNodePortsData, WorkflowOperationBaseService, WorkflowOperationBaseServiceImpl, WorkflowPort, WorkflowPortEntity, WorkflowPortType, WorkflowPorts, WorkflowResetLayoutService, WorkflowSelectService, buildGroupJSON, fitView, getAntiOverlapPosition, getLineCenter, nanoid, useCurrentDomNode, useCurrentEntity, useNodeRender, usePlaygroundReadonlyState, useWorkflowDocument };
429
+ export { EditorCursorState, InteractiveType, LineCenterPoint, LineEventProps, LinePosition, LineRenderType, NodePostionUpdateEvent, type NodeRenderReturnType, NodesDragEvent, OnDragLineEnd, type PositionMap, WorkflowCommands, WorkflowDocument, WorkflowDocumentContainerModule, WorkflowDocumentOptions, WorkflowDragService, WorkflowHoverService, WorkflowJSON, WorkflowLineEntity, WorkflowLineRenderContribution, WorkflowLineRenderData, type WorkflowLineRenderDataSchema, WorkflowLinesManager, WorkflowNodeEntity, WorkflowNodeJSON, WorkflowOperationBaseService, WorkflowOperationBaseServiceImpl, WorkflowPortEntity, WorkflowResetLayoutService, WorkflowSelectService, buildGroupJSON, fitView, getAntiOverlapPosition, getLineCenter, nanoid, useCurrentDomNode, useCurrentEntity, useNodeRender, usePlaygroundReadonlyState, useWorkflowDocument };
package/dist/index.d.ts CHANGED
@@ -2,10 +2,8 @@ import { PlaygroundConfigEntity, CommandService, PlaygroundDragEvent, EntityData
2
2
  export { bindConfigEntity, useConfigEntity, useEntities, useEntityDataFromContext, useEntityFromContext, useListenEvents, usePlayground, usePlaygroundContainer, usePlaygroundContext, useRefresh, useService } from '@flowgram.ai/core';
3
3
  import { NodeFormProps } from '@flowgram.ai/node';
4
4
  import { FlowOperationBaseService, FlowNodeType, FlowOperationBaseServiceImpl, FlowNodeEntityOrId, FlowNodeEntity } from '@flowgram.ai/document';
5
- import { W as WorkflowHoverService, a as WorkflowDocument, b as WorkflowLinesManager, c as WorkflowSelectService, d as WorkflowDocumentOptions, L as LineEventProps, N as NodesDragEvent, e as WorkflowNodeJSON, f as WorkflowPortEntity, g as WorkflowLineEntity, O as OnDragLineEnd, h as WorkflowJSON, i as LineCenterPoint, j as WorkflowPorts, k as WorkflowPortType, l as LinePoint, m as WorkflowPort, n as LineRenderType, o as WorkflowLineRenderContribution, p as LinePosition } from './workflow-line-entity-DcecHiNc.js';
6
- export { R as HoverPosition, F as LINE_HOVER_DISTANCE, y as LineColor, z as LineColors, x as LinePointLocation, w as LineType, C as NodesDragEndEvent, B as NodesDragStartEvent, D as NodesDraggingEvent, P as POINT_RADIUS, K as PORT_SIZE, r as WORKFLOW_LINE_ENTITY, S as WorkfloEntityHoverable, u as WorkflowContentChangeEvent, t as WorkflowContentChangeType, U as WorkflowDocumentOptionsDefault, T as WorkflowDocumentProvider, Q as WorkflowEntityHoverable, H as WorkflowLineEntityOpts, I as WorkflowLineInfo, G as WorkflowLinePortInfo, A as WorkflowLineRenderContributionFactory, J as WorkflowLineUIState, v as WorkflowNodeMeta, M as WorkflowPortEntityOpts, s as domReactToBounds, q as getPortEntityId, E as onDragLineEndParams } from './workflow-line-entity-DcecHiNc.js';
7
- import { W as WorkflowNodeEntity } from './workflow-sub-canvas-IQzlYvPD.js';
8
- export { a as WorkflowSubCanvas } from './workflow-sub-canvas-IQzlYvPD.js';
5
+ import { W as WorkflowHoverService, a as WorkflowDocument, b as WorkflowLinesManager, c as WorkflowSelectService, d as WorkflowDocumentOptions, L as LineEventProps, N as NodesDragEvent, e as WorkflowNodeJSON, f as WorkflowNodeEntity, g as WorkflowPortEntity, h as WorkflowLineEntity, O as OnDragLineEnd, i as LineRenderType, j as WorkflowLineRenderContribution, k as LinePosition, l as LineCenterPoint, m as WorkflowJSON } from './workflow-node-entity-GyY_PHY6.js';
6
+ export { X as HoverPosition, F as LINE_HOVER_DISTANCE, x as LineColor, y as LineColors, w as LinePoint, v as LinePointLocation, u as LineType, C as NodesDragEndEvent, B as NodesDragStartEvent, D as NodesDraggingEvent, P as POINT_RADIUS, K as PORT_SIZE, p as WORKFLOW_LINE_ENTITY, Y as WorkfloEntityHoverable, s as WorkflowContentChangeEvent, r as WorkflowContentChangeType, _ as WorkflowDocumentOptionsDefault, Z as WorkflowDocumentProvider, V as WorkflowEntityHoverable, H as WorkflowLineEntityOpts, I as WorkflowLineInfo, G as WorkflowLinePortInfo, z as WorkflowLineRenderContributionFactory, J as WorkflowLineUIState, T as WorkflowNodeLines, U as WorkflowNodeLinesData, t as WorkflowNodeMeta, S as WorkflowNodePortsData, M as WorkflowPort, R as WorkflowPortEntityOpts, n as WorkflowPortType, Q as WorkflowPorts, A as WorkflowSubCanvas, q as domReactToBounds, o as getPortEntityId, E as onDragLineEndParams } from './workflow-node-entity-GyY_PHY6.js';
9
7
  import * as _flowgram_ai_utils from '@flowgram.ai/utils';
10
8
  import { DisposableCollection, IPoint, Disposable, Rectangle } from '@flowgram.ai/utils';
11
9
  export { compose, composeAsync, delay } from '@flowgram.ai/utils';
@@ -116,6 +114,10 @@ declare class WorkflowDragService {
116
114
  private clearDrop;
117
115
  private setLineColor;
118
116
  private handleDragOnNode;
117
+ /**
118
+ * 容器内子节点总体位置重置为0
119
+ */
120
+ private resetContainerInternalPosition;
119
121
  private childrenOfContainer;
120
122
  /**
121
123
  * 绘制线条
@@ -191,6 +193,46 @@ declare class WorkflowOperationBaseServiceImpl extends FlowOperationBaseServiceI
191
193
  updateNodePosition(nodeOrId: FlowNodeEntityOrId, position: IPoint): void;
192
194
  }
193
195
 
196
+ /**
197
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
198
+ * SPDX-License-Identifier: MIT
199
+ */
200
+
201
+ interface WorkflowLineRenderDataSchema {
202
+ version: string;
203
+ contributions: Map<LineRenderType, WorkflowLineRenderContribution>;
204
+ position: LinePosition;
205
+ }
206
+ declare class WorkflowLineRenderData extends EntityData<WorkflowLineRenderDataSchema> {
207
+ static type: string;
208
+ entity: WorkflowLineEntity;
209
+ constructor(entity: WorkflowLineEntity);
210
+ getDefaultData(): WorkflowLineRenderDataSchema;
211
+ get renderVersion(): string;
212
+ get position(): LinePosition;
213
+ get path(): string;
214
+ calcDistance(pos: IPoint): number;
215
+ get bounds(): Rectangle;
216
+ /**
217
+ * 更新数据
218
+ * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
219
+ */
220
+ update(): void;
221
+ private get lineType();
222
+ /**
223
+ * 获取 center 位置
224
+ */
225
+ get center(): LineCenterPoint;
226
+ /**
227
+ * 更新版本
228
+ * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
229
+ */
230
+ private updatePosition;
231
+ private get currentLine();
232
+ private syncContributions;
233
+ private registerContribution;
234
+ }
235
+
194
236
  /**
195
237
  * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
196
238
  * SPDX-License-Identifier: MIT
@@ -377,184 +419,6 @@ declare enum InteractiveType {
377
419
  PAD = "PAD"
378
420
  }
379
421
 
380
- /**
381
- * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
382
- * SPDX-License-Identifier: MIT
383
- */
384
-
385
- /**
386
- * 节点的点位信息
387
- * portsData 只监听点位的数目和类型,不监听点位的 position 变化
388
- */
389
- declare class WorkflowNodePortsData extends EntityData {
390
- static readonly type = "WorkflowNodePortsData";
391
- readonly entity: WorkflowNodeEntity;
392
- /** 静态的 ports 数据 */
393
- protected _staticPorts: WorkflowPorts;
394
- /** 存储 port 实体的 id,用于判断 port 是否存在 */
395
- protected _portIDSet: Set<string>;
396
- /** 上一次的 ports 数据,用于判断 ports 是否发生变化 */
397
- protected _prePorts: WorkflowPorts;
398
- constructor(entity: WorkflowNodeEntity);
399
- getDefaultData(): any;
400
- /**
401
- * Update all ports data, includes static ports and dynamic ports
402
- * @param ports
403
- */
404
- updateAllPorts(ports?: WorkflowPorts): void;
405
- /**
406
- * @deprecated use `updateAllPorts` instead
407
- */
408
- updateStaticPorts(ports: WorkflowPorts): void;
409
- /**
410
- * 动态计算点位,通过 dom 的 data-port-key
411
- */
412
- updateDynamicPorts(): void;
413
- /**
414
- * 根据 key 获取 port 实体
415
- */
416
- getPortEntityByKey(portType: WorkflowPortType, portKey?: string | number): WorkflowPortEntity;
417
- /**
418
- * 更新 ports 数据
419
- */
420
- protected updatePorts(ports: WorkflowPorts): void;
421
- /**
422
- * 获取所有 port entities
423
- */
424
- get allPorts(): WorkflowPortEntity[];
425
- /**
426
- * 获取输入点位
427
- */
428
- get inputPorts(): WorkflowPortEntity[];
429
- /**
430
- * 获取输出点位
431
- */
432
- get outputPorts(): WorkflowPortEntity[];
433
- /**
434
- * 获取输入点位置
435
- */
436
- get inputPoints(): LinePoint[];
437
- /**
438
- * 获取输出点位置
439
- */
440
- get outputPoints(): LinePoint[];
441
- /**
442
- * 根据 key 获取 输入点位置
443
- */
444
- getInputPoint(key?: string | number): LinePoint;
445
- /**
446
- * 根据 key 获取输出点位置
447
- */
448
- getOutputPoint(key?: string | number): LinePoint;
449
- /**
450
- * 获取 port 实体
451
- */
452
- protected getPortEntity(portId: string): WorkflowPortEntity | undefined;
453
- /**
454
- * 拼接 port 实体的 id
455
- */
456
- protected getPortId(portType: WorkflowPortType, portKey?: string | number): string;
457
- /**
458
- * 创建 port 实体
459
- */
460
- protected createPortEntity(portInfo: WorkflowPort): WorkflowPortEntity;
461
- /**
462
- * 获取或创建 port 实体
463
- */
464
- protected getOrCreatePortEntity(portInfo: WorkflowPort): WorkflowPortEntity;
465
- /**
466
- * 更新 port 实体
467
- */
468
- protected updatePortEntity(portInfo: WorkflowPort): WorkflowPortEntity;
469
- }
470
-
471
- /**
472
- * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
473
- * SPDX-License-Identifier: MIT
474
- */
475
-
476
- interface WorkflowNodeLines {
477
- inputLines: WorkflowLineEntity[];
478
- outputLines: WorkflowLineEntity[];
479
- }
480
- /**
481
- * 节点的关联的线条
482
- */
483
- declare class WorkflowNodeLinesData extends EntityData<WorkflowNodeLines> {
484
- static type: string;
485
- entity: WorkflowNodeEntity;
486
- getDefaultData(): WorkflowNodeLines;
487
- constructor(entity: WorkflowNodeEntity);
488
- /**
489
- * 输入线条
490
- */
491
- get inputLines(): WorkflowLineEntity[];
492
- /**
493
- * 输出线条
494
- */
495
- get outputLines(): WorkflowLineEntity[];
496
- get allLines(): WorkflowLineEntity[];
497
- get availableLines(): WorkflowLineEntity[];
498
- /**
499
- * 输入节点
500
- */
501
- get inputNodes(): WorkflowNodeEntity[];
502
- /**
503
- * 所有输入节点
504
- */
505
- get allInputNodes(): WorkflowNodeEntity[];
506
- /**
507
- * 输出节点
508
- */
509
- get outputNodes(): WorkflowNodeEntity[];
510
- /**
511
- * 输入输出节点
512
- */
513
- get allOutputNodes(): WorkflowNodeEntity[];
514
- addLine(line: WorkflowLineEntity): void;
515
- removeLine(line: WorkflowLineEntity): void;
516
- }
517
-
518
- /**
519
- * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
520
- * SPDX-License-Identifier: MIT
521
- */
522
-
523
- interface WorkflowLineRenderDataSchema {
524
- version: string;
525
- contributions: Map<LineRenderType, WorkflowLineRenderContribution>;
526
- position: LinePosition;
527
- }
528
- declare class WorkflowLineRenderData extends EntityData<WorkflowLineRenderDataSchema> {
529
- static type: string;
530
- entity: WorkflowLineEntity;
531
- constructor(entity: WorkflowLineEntity);
532
- getDefaultData(): WorkflowLineRenderDataSchema;
533
- get renderVersion(): string;
534
- get position(): LinePosition;
535
- get path(): string;
536
- calcDistance(pos: IPoint): number;
537
- get bounds(): Rectangle;
538
- /**
539
- * 更新数据
540
- * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
541
- */
542
- update(): void;
543
- private get lineType();
544
- /**
545
- * 获取 center 位置
546
- */
547
- get center(): LineCenterPoint;
548
- /**
549
- * 更新版本
550
- * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
551
- */
552
- private updatePosition;
553
- private get currentLine();
554
- private syncContributions;
555
- private registerContribution;
556
- }
557
-
558
422
  /**
559
423
  * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
560
424
  * SPDX-License-Identifier: MIT
@@ -562,4 +426,4 @@ declare class WorkflowLineRenderData extends EntityData<WorkflowLineRenderDataSc
562
426
 
563
427
  declare const WorkflowDocumentContainerModule: ContainerModule;
564
428
 
565
- export { EditorCursorState, InteractiveType, LineCenterPoint, LineEventProps, LinePoint, LinePosition, LineRenderType, NodePostionUpdateEvent, type NodeRenderReturnType, NodesDragEvent, OnDragLineEnd, type PositionMap, WorkflowCommands, WorkflowDocument, WorkflowDocumentContainerModule, WorkflowDocumentOptions, WorkflowDragService, WorkflowHoverService, WorkflowJSON, WorkflowLineEntity, WorkflowLineRenderContribution, WorkflowLineRenderData, type WorkflowLineRenderDataSchema, WorkflowLinesManager, WorkflowNodeEntity, WorkflowNodeJSON, type WorkflowNodeLines, WorkflowNodeLinesData, WorkflowNodePortsData, WorkflowOperationBaseService, WorkflowOperationBaseServiceImpl, WorkflowPort, WorkflowPortEntity, WorkflowPortType, WorkflowPorts, WorkflowResetLayoutService, WorkflowSelectService, buildGroupJSON, fitView, getAntiOverlapPosition, getLineCenter, nanoid, useCurrentDomNode, useCurrentEntity, useNodeRender, usePlaygroundReadonlyState, useWorkflowDocument };
429
+ export { EditorCursorState, InteractiveType, LineCenterPoint, LineEventProps, LinePosition, LineRenderType, NodePostionUpdateEvent, type NodeRenderReturnType, NodesDragEvent, OnDragLineEnd, type PositionMap, WorkflowCommands, WorkflowDocument, WorkflowDocumentContainerModule, WorkflowDocumentOptions, WorkflowDragService, WorkflowHoverService, WorkflowJSON, WorkflowLineEntity, WorkflowLineRenderContribution, WorkflowLineRenderData, type WorkflowLineRenderDataSchema, WorkflowLinesManager, WorkflowNodeEntity, WorkflowNodeJSON, WorkflowOperationBaseService, WorkflowOperationBaseServiceImpl, WorkflowPortEntity, WorkflowResetLayoutService, WorkflowSelectService, buildGroupJSON, fitView, getAntiOverlapPosition, getLineCenter, nanoid, useCurrentDomNode, useCurrentEntity, useNodeRender, usePlaygroundReadonlyState, useWorkflowDocument };
package/dist/index.js CHANGED
@@ -818,11 +818,11 @@ var WorkflowLineRenderData = class extends import_core7.EntityData {
818
818
  * WARNING: 这个方法,必须在 requestAnimationFrame / useLayoutEffect 中调用,否则会引起浏览器强制重排
819
819
  */
820
820
  updatePosition() {
821
- this.data.position.from = this.entity.from.getData(WorkflowNodePortsData).getOutputPoint(this.entity.info.fromPort);
821
+ this.data.position.from = this.entity.from.ports.getOutputPoint(this.entity.info.fromPort);
822
822
  if (this.entity.info.drawingTo) {
823
823
  this.data.position.to = this.entity.info.drawingTo;
824
824
  } else {
825
- this.data.position.to = this.entity.to?.getData(WorkflowNodePortsData)?.getInputPoint(this.entity.info.toPort) ?? {
825
+ this.data.position.to = this.entity.to?.ports?.getInputPoint(this.entity.info.toPort) ?? {
826
826
  x: this.data.position.from.x,
827
827
  y: this.data.position.from.y,
828
828
  location: this.data.position.from.location === "right" ? "left" : "top"
@@ -1084,13 +1084,13 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends import_core8.Entity
1084
1084
  return this.getData(WorkflowLineRenderData).calcDistance(pos);
1085
1085
  }
1086
1086
  get fromPort() {
1087
- return this.from.getData(WorkflowNodePortsData).getPortEntityByKey("output", this.info.fromPort);
1087
+ return this.from.ports.getPortEntityByKey("output", this.info.fromPort);
1088
1088
  }
1089
1089
  get toPort() {
1090
1090
  if (!this.to) {
1091
1091
  return void 0;
1092
1092
  }
1093
- return this.to.getData(WorkflowNodePortsData).getPortEntityByKey("input", this.info.toPort);
1093
+ return this.to.ports.getPortEntityByKey("input", this.info.toPort);
1094
1094
  }
1095
1095
  /**
1096
1096
  * 获取线条真实的输入输出节点坐标
@@ -1791,7 +1791,7 @@ var WorkflowLinesManager = class {
1791
1791
  */
1792
1792
  getPortFromMousePos(pos) {
1793
1793
  const allNodes = this.getSortedNodes().reverse();
1794
- const allPorts = allNodes.map((node) => node.getData(WorkflowNodePortsData).allPorts).flat();
1794
+ const allPorts = allNodes.map((node) => node.ports.allPorts).flat();
1795
1795
  const targetPort = allPorts.find((port) => port.isHovered(pos.x, pos.y));
1796
1796
  if (targetPort) {
1797
1797
  const containNodes = this.getContainNodesFromMousePos(pos);
@@ -2230,8 +2230,11 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2230
2230
  originParent,
2231
2231
  meta
2232
2232
  });
2233
+ this.options.preNodeCreate?.(node);
2233
2234
  const datas = dataRegistries ? this.nodeDataRegistries.concat(...dataRegistries) : this.nodeDataRegistries;
2234
2235
  node.addInitializeData(datas);
2236
+ node.ports = node.getData(WorkflowNodePortsData);
2237
+ node.lines = node.getData(WorkflowNodeLinesData);
2235
2238
  node.onDispose(() => this.onNodeDisposeEmitter.fire({ node }));
2236
2239
  this.options.fromNodeJSON?.(node, data, true);
2237
2240
  isNew = true;
@@ -2682,10 +2685,6 @@ var WorkflowDragService = class {
2682
2685
  return Promise.resolve(false);
2683
2686
  }
2684
2687
  this.isDragging = true;
2685
- const sameParent = this.childrenOfContainer(selectedNodes);
2686
- if (sameParent && sameParent.flowNodeType !== import_document10.FlowNodeBaseType.ROOT) {
2687
- selectedNodes = [sameParent];
2688
- }
2689
2688
  let startPosition = this.getNodesPosition(selectedNodes);
2690
2689
  let startPositions = selectedNodes.map((node) => {
2691
2690
  const transform = node.getData(import_core15.TransformData);
@@ -2747,6 +2746,7 @@ var WorkflowDragService = class {
2747
2746
  triggerEvent,
2748
2747
  dragger
2749
2748
  });
2749
+ this.resetContainerInternalPosition(selectedNodes);
2750
2750
  }
2751
2751
  });
2752
2752
  const { clientX, clientY } = import_core15.MouseTouchEvent.getEventCoord(triggerEvent);
@@ -3017,12 +3017,48 @@ var WorkflowDragService = class {
3017
3017
  };
3018
3018
  }
3019
3019
  }
3020
+ /**
3021
+ * 容器内子节点总体位置重置为0
3022
+ */
3023
+ resetContainerInternalPosition(nodes) {
3024
+ const container = this.childrenOfContainer(nodes);
3025
+ if (!container) {
3026
+ return;
3027
+ }
3028
+ const bounds = import_utils16.Rectangle.enlarge(
3029
+ container.blocks.map((node) => {
3030
+ const x = node.transform.position.x - node.transform.bounds.width / 2;
3031
+ const y = node.transform.position.y;
3032
+ const width = node.transform.bounds.width;
3033
+ const height = node.transform.bounds.height;
3034
+ return new import_utils16.Rectangle(x, y, width, height);
3035
+ })
3036
+ );
3037
+ const containerTransform = container.getData(import_core15.TransformData);
3038
+ containerTransform.update({
3039
+ position: {
3040
+ x: containerTransform.position.x + bounds.x,
3041
+ y: containerTransform.position.y + bounds.y
3042
+ }
3043
+ });
3044
+ this.document.layout.updateAffectedTransform(container);
3045
+ container.blocks.forEach((node) => {
3046
+ const transform = node.getData(import_core15.TransformData);
3047
+ transform.update({
3048
+ position: {
3049
+ x: transform.position.x - bounds.x,
3050
+ y: transform.position.y - bounds.y
3051
+ }
3052
+ });
3053
+ this.document.layout.updateAffectedTransform(node);
3054
+ });
3055
+ }
3020
3056
  childrenOfContainer(nodes) {
3021
3057
  if (nodes.length === 0) {
3022
3058
  return;
3023
3059
  }
3024
3060
  const sourceContainer = nodes[0]?.parent;
3025
- if (!sourceContainer || sourceContainer.collapsedChildren.length !== nodes.length) {
3061
+ if (!sourceContainer) {
3026
3062
  return;
3027
3063
  }
3028
3064
  const valid = nodes.every((node) => node?.parent === sourceContainer);
@@ -3223,7 +3259,7 @@ var WorkflowDragService = class {
3223
3259
  }
3224
3260
  /** 获取最近的 port */
3225
3261
  getNearestPort(node, mousePos) {
3226
- const portsData = node.getData(WorkflowNodePortsData);
3262
+ const portsData = node.ports;
3227
3263
  const distanceSortedPorts = portsData.inputPorts.sort((a, b) => {
3228
3264
  const aDistance = Math.abs(mousePos.y - a.point.y);
3229
3265
  const bDistance = Math.abs(mousePos.y - b.point.y);
@@ -3428,7 +3464,7 @@ var isFirefox = navigator?.userAgent?.includes?.("Firefox");
3428
3464
  function useNodeRender(nodeFromProps) {
3429
3465
  const node = nodeFromProps || (0, import_react2.useContext)(import_core21.PlaygroundEntityContext);
3430
3466
  const renderData = node.getData(import_document13.FlowNodeRenderData);
3431
- const portsData = node.getData(WorkflowNodePortsData);
3467
+ const portsData = node.ports;
3432
3468
  const readonly = usePlaygroundReadonlyState();
3433
3469
  const dragService = (0, import_core21.useService)(WorkflowDragService);
3434
3470
  const selectionService = (0, import_core21.useService)(WorkflowSelectService);