@flowgram.ai/free-layout-core 0.3.3 → 0.3.5

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.
@@ -6,6 +6,7 @@ var WorkflowContentChangeType = /* @__PURE__ */ ((WorkflowContentChangeType2) =>
6
6
  WorkflowContentChangeType2["NODE_DATA_CHANGE"] = "NODE_DATA_CHANGE";
7
7
  WorkflowContentChangeType2["ADD_LINE"] = "ADD_LINE";
8
8
  WorkflowContentChangeType2["DELETE_LINE"] = "DELETE_LINE";
9
+ WorkflowContentChangeType2["LINE_DATA_CHANGE"] = "LINE_DATA_CHANGE";
9
10
  WorkflowContentChangeType2["META_CHANGE"] = "META_CHANGE";
10
11
  return WorkflowContentChangeType2;
11
12
  })(WorkflowContentChangeType || {});
@@ -13,4 +14,4 @@ var WorkflowContentChangeType = /* @__PURE__ */ ((WorkflowContentChangeType2) =>
13
14
  export {
14
15
  WorkflowContentChangeType
15
16
  };
16
- //# sourceMappingURL=chunk-242F2JCI.js.map
17
+ //# sourceMappingURL=chunk-U2XMPOSL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/typings/workflow-json.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type WorkflowLineEntity, type WorkflowNodeEntity } from '../entities';\nimport { type WorkflowNodeJSON } from './workflow-node';\nimport { type WorkflowEdgeJSON } from './workflow-edge';\n\nexport interface WorkflowJSON {\n nodes: WorkflowNodeJSON[];\n edges: WorkflowEdgeJSON[];\n}\n\nexport enum WorkflowContentChangeType {\n /**\n * 添加节点\n */\n ADD_NODE = 'ADD_NODE',\n /**\n * 删除节点\n */\n DELETE_NODE = 'DELETE_NODE',\n /**\n * 移动节点\n */\n MOVE_NODE = 'MOVE_NODE',\n /**\n * 节点数据更新 (表单引擎数据 或者 extInfo 数据)\n */\n NODE_DATA_CHANGE = 'NODE_DATA_CHANGE',\n /**\n * 添加线条\n */\n ADD_LINE = 'ADD_LINE',\n /**\n * 删除线条\n */\n DELETE_LINE = 'DELETE_LINE',\n /**\n * 节点Meta信息变更\n */\n META_CHANGE = 'META_CHANGE',\n}\n\nexport interface WorkflowContentChangeEvent {\n type: WorkflowContentChangeType;\n /**\n * 当前触发的元素的json数据,toJSON 需要主动触发\n */\n toJSON: () => any;\n /*\n * 当前的事件的 entity\n */\n entity: WorkflowNodeEntity | WorkflowLineEntity;\n}\n"],"mappings":";AAcO,IAAK,4BAAL,kBAAKA,+BAAL;AAIL,EAAAA,2BAAA,cAAW;AAIX,EAAAA,2BAAA,iBAAc;AAId,EAAAA,2BAAA,eAAY;AAIZ,EAAAA,2BAAA,sBAAmB;AAInB,EAAAA,2BAAA,cAAW;AAIX,EAAAA,2BAAA,iBAAc;AAId,EAAAA,2BAAA,iBAAc;AA5BJ,SAAAA;AAAA,GAAA;","names":["WorkflowContentChangeType"]}
1
+ {"version":3,"sources":["../../src/typings/workflow-json.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type WorkflowLineEntity, type WorkflowNodeEntity } from '../entities';\nimport { type WorkflowNodeJSON } from './workflow-node';\nimport { type WorkflowEdgeJSON } from './workflow-edge';\n\nexport interface WorkflowJSON {\n nodes: WorkflowNodeJSON[];\n edges: WorkflowEdgeJSON[];\n}\n\nexport enum WorkflowContentChangeType {\n /**\n * 添加节点\n */\n ADD_NODE = 'ADD_NODE',\n /**\n * 删除节点\n */\n DELETE_NODE = 'DELETE_NODE',\n /**\n * 移动节点\n */\n MOVE_NODE = 'MOVE_NODE',\n /**\n * 节点数据更新 (表单引擎数据 或者 extInfo 数据)\n */\n NODE_DATA_CHANGE = 'NODE_DATA_CHANGE',\n /**\n * 添加线条\n */\n ADD_LINE = 'ADD_LINE',\n /**\n * 删除线条\n */\n DELETE_LINE = 'DELETE_LINE',\n /**\n * 线条数据修改\n */\n LINE_DATA_CHANGE = 'LINE_DATA_CHANGE',\n /**\n * 节点Meta信息变更\n */\n META_CHANGE = 'META_CHANGE',\n}\n\nexport interface WorkflowContentChangeEvent {\n type: WorkflowContentChangeType;\n /**\n * 当前触发的元素的json数据,toJSON 需要主动触发\n */\n toJSON: () => any;\n /**\n * oldValue\n */\n oldValue?: any;\n /*\n * 当前的事件的 entity\n */\n entity: WorkflowNodeEntity | WorkflowLineEntity;\n}\n"],"mappings":";AAcO,IAAK,4BAAL,kBAAKA,+BAAL;AAIL,EAAAA,2BAAA,cAAW;AAIX,EAAAA,2BAAA,iBAAc;AAId,EAAAA,2BAAA,eAAY;AAIZ,EAAAA,2BAAA,sBAAmB;AAInB,EAAAA,2BAAA,cAAW;AAIX,EAAAA,2BAAA,iBAAc;AAId,EAAAA,2BAAA,sBAAmB;AAInB,EAAAA,2BAAA,iBAAc;AAhCJ,SAAAA;AAAA,GAAA;","names":["WorkflowContentChangeType"]}
package/dist/esm/index.js CHANGED
@@ -7,7 +7,7 @@ import "./chunk-TQLT57GW.js";
7
7
  import "./chunk-CGOMTQ3G.js";
8
8
  import {
9
9
  WorkflowContentChangeType
10
- } from "./chunk-242F2JCI.js";
10
+ } from "./chunk-U2XMPOSL.js";
11
11
  import {
12
12
  LineColors,
13
13
  LineType
@@ -158,7 +158,7 @@ var WorkflowNodeEntity = FlowNodeEntity;
158
158
 
159
159
  // src/entities/workflow-line-entity.ts
160
160
  import { isEqual as isEqual2 } from "lodash-es";
161
- import { domUtils } from "@flowgram.ai/utils";
161
+ import { domUtils, Emitter as Emitter2 } from "@flowgram.ai/utils";
162
162
  import { Entity as Entity2 } from "@flowgram.ai/core";
163
163
 
164
164
  // src/entity-datas/workflow-node-ports-data.ts
@@ -789,6 +789,8 @@ var POINT_RADIUS = 10;
789
789
  var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
790
790
  constructor(opts) {
791
791
  super(opts);
792
+ this._onLineDataChangeEmitter = new Emitter2();
793
+ this.onLineDataChange = this._onLineDataChangeEmitter.event;
792
794
  this._uiState = {
793
795
  hasError: false,
794
796
  flowing: false,
@@ -813,7 +815,8 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
813
815
  to: opts.to,
814
816
  drawingTo: opts.drawingTo,
815
817
  fromPort: opts.fromPort,
816
- toPort: opts.toPort
818
+ toPort: opts.toPort,
819
+ data: opts.data
817
820
  });
818
821
  if (opts.drawingTo) {
819
822
  this.isDrawing = true;
@@ -826,6 +829,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
826
829
  this.fromPort?.validate();
827
830
  this.toPort?.validate();
828
831
  });
832
+ this.toDispose.push(this._onLineDataChangeEmitter);
829
833
  }
830
834
  /**
831
835
  * 转成线条 id
@@ -868,9 +872,13 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
868
872
  * 更新线条扩展数据
869
873
  * @param data
870
874
  */
871
- set lineData(data) {
872
- this._lineData = data;
873
- this.fireChange();
875
+ set lineData(newValue) {
876
+ const oldValue = this._lineData;
877
+ if (!isEqual2(oldValue, newValue)) {
878
+ this._lineData = newValue;
879
+ this._onLineDataChangeEmitter.fire({ oldValue, newValue });
880
+ this.fireChange();
881
+ }
874
882
  }
875
883
  /**
876
884
  * 获取线条的前置节点
@@ -936,7 +944,6 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
936
944
  const { node, portID } = toPort;
937
945
  this._to = node;
938
946
  this.info.drawingTo = void 0;
939
- this.info.isDefaultLine = false;
940
947
  this.info.to = node.id;
941
948
  this.info.toPort = portID;
942
949
  } else {
@@ -961,7 +968,6 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
961
968
  }
962
969
  if (!oldDrawingTo || pos.x !== oldDrawingTo.x || pos.y !== oldDrawingTo.y) {
963
970
  this.info.to = void 0;
964
- this.info.isDefaultLine = false;
965
971
  this.info.drawingTo = pos;
966
972
  this.fireChange();
967
973
  }
@@ -1055,6 +1061,7 @@ var _WorkflowLineEntity = class _WorkflowLineEntity extends Entity2 {
1055
1061
  this.info = info;
1056
1062
  this._from = this.document.getNode(info.from);
1057
1063
  this._to = info.to ? this.document.getNode(info.to) : void 0;
1064
+ this._lineData = info.data;
1058
1065
  this.fireChange();
1059
1066
  }
1060
1067
  }
@@ -1215,12 +1222,12 @@ WorkflowSelectService = __decorateClass([
1215
1222
 
1216
1223
  // src/service/workflow-hover-service.ts
1217
1224
  import { inject as inject2, injectable as injectable2 } from "inversify";
1218
- import { Emitter as Emitter2 } from "@flowgram.ai/utils";
1225
+ import { Emitter as Emitter3 } from "@flowgram.ai/utils";
1219
1226
  import { EntityManager } from "@flowgram.ai/core";
1220
1227
  var WorkflowHoverService = class {
1221
1228
  constructor() {
1222
- this.onHoveredChangeEmitter = new Emitter2();
1223
- this.onUpdateHoverPositionEmitter = new Emitter2();
1229
+ this.onHoveredChangeEmitter = new Emitter3();
1230
+ this.onUpdateHoverPositionEmitter = new Emitter3();
1224
1231
  this.onHoveredChange = this.onHoveredChangeEmitter.event;
1225
1232
  this.onUpdateHoverPosition = this.onUpdateHoverPositionEmitter.event;
1226
1233
  // 当前鼠标 hover 位置
@@ -1286,7 +1293,7 @@ import { inject as inject6, injectable as injectable6, postConstruct as postCons
1286
1293
  import {
1287
1294
  domUtils as domUtils2,
1288
1295
  PromiseDeferred,
1289
- Emitter as Emitter5,
1296
+ Emitter as Emitter6,
1290
1297
  DisposableCollection as DisposableCollection2,
1291
1298
  Rectangle as Rectangle8,
1292
1299
  delay as delay2
@@ -1307,7 +1314,7 @@ import {
1307
1314
  // src/workflow-lines-manager.ts
1308
1315
  import { last } from "lodash-es";
1309
1316
  import { inject as inject3, injectable as injectable3 } from "inversify";
1310
- import { DisposableCollection, Emitter as Emitter3 } from "@flowgram.ai/utils";
1317
+ import { DisposableCollection, Emitter as Emitter4 } from "@flowgram.ai/utils";
1311
1318
  import { FlowNodeRenderData as FlowNodeRenderData2, FlowNodeTransformData as FlowNodeTransformData3 } from "@flowgram.ai/document";
1312
1319
  import { EntityManager as EntityManager2, PlaygroundConfigEntity as PlaygroundConfigEntity2 } from "@flowgram.ai/core";
1313
1320
 
@@ -1391,8 +1398,8 @@ var WorkflowLinesManager = class {
1391
1398
  this.toDispose = new DisposableCollection();
1392
1399
  // 线条类型
1393
1400
  this._lineType = 0 /* BEZIER */;
1394
- this.onAvailableLinesChangeEmitter = new Emitter3();
1395
- this.onForceUpdateEmitter = new Emitter3();
1401
+ this.onAvailableLinesChangeEmitter = new Emitter4();
1402
+ this.onForceUpdateEmitter = new Emitter4();
1396
1403
  /**
1397
1404
  * 有效的线条被添加或者删除时候触发,未连上的线条不算
1398
1405
  */
@@ -1463,6 +1470,9 @@ var WorkflowLinesManager = class {
1463
1470
  WorkflowLineEntity.portInfoToLineId(portInfo)
1464
1471
  );
1465
1472
  }
1473
+ getLineById(id) {
1474
+ return this.entityManager.getEntityById(id);
1475
+ }
1466
1476
  replaceLine(oldPortInfo, newPortInfo) {
1467
1477
  const oldLine = this.getLine(oldPortInfo);
1468
1478
  if (oldLine) {
@@ -1471,7 +1481,7 @@ var WorkflowLinesManager = class {
1471
1481
  return this.createLine(newPortInfo);
1472
1482
  }
1473
1483
  createLine(options) {
1474
- const { from, to, drawingTo, fromPort, toPort } = options;
1484
+ const { from, to, drawingTo, fromPort, toPort, data } = options;
1475
1485
  const available = Boolean(from && to);
1476
1486
  const key = options.key || WorkflowLineEntity.portInfoToLineId(options);
1477
1487
  let line = this.entityManager.getEntityById(key);
@@ -1494,7 +1504,8 @@ var WorkflowLinesManager = class {
1494
1504
  fromPort,
1495
1505
  toPort,
1496
1506
  to,
1497
- drawingTo
1507
+ drawingTo,
1508
+ data
1498
1509
  });
1499
1510
  this.registerData(line);
1500
1511
  fromNode.addLine(line);
@@ -1515,6 +1526,14 @@ var WorkflowLinesManager = class {
1515
1526
  });
1516
1527
  }
1517
1528
  });
1529
+ line.onLineDataChange(({ oldValue }) => {
1530
+ this.onAvailableLinesChangeEmitter.fire({
1531
+ type: "LINE_DATA_CHANGE" /* LINE_DATA_CHANGE */,
1532
+ toJSON: () => line.toJSON(),
1533
+ oldValue,
1534
+ entity: line
1535
+ });
1536
+ });
1518
1537
  if (available) {
1519
1538
  this.onAvailableLinesChangeEmitter.fire({
1520
1539
  type: "ADD_LINE" /* ADD_LINE */,
@@ -1738,7 +1757,7 @@ WorkflowLinesManager = __decorateClass([
1738
1757
  // src/workflow-document.ts
1739
1758
  import { customAlphabet } from "nanoid";
1740
1759
  import { inject as inject5, injectable as injectable5, optional, postConstruct } from "inversify";
1741
- import { Emitter as Emitter4 } from "@flowgram.ai/utils";
1760
+ import { Emitter as Emitter5 } from "@flowgram.ai/utils";
1742
1761
  import { NodeEngineContext } from "@flowgram.ai/form-core";
1743
1762
  import {
1744
1763
  FlowDocument,
@@ -1899,10 +1918,10 @@ var WorkflowDocumentProvider = Symbol("WorkflowDocumentProvider");
1899
1918
  var WorkflowDocument = class extends FlowDocument {
1900
1919
  constructor() {
1901
1920
  super(...arguments);
1902
- this._onContentChangeEmitter = new Emitter4();
1903
- this.onLoadedEmitter = new Emitter4();
1921
+ this._onContentChangeEmitter = new Emitter5();
1922
+ this.onLoadedEmitter = new Emitter5();
1904
1923
  this.onContentChange = this._onContentChangeEmitter.event;
1905
- this._onReloadEmitter = new Emitter4();
1924
+ this._onReloadEmitter = new Emitter5();
1906
1925
  this.onReload = this._onReloadEmitter.event;
1907
1926
  /**
1908
1927
  * 数据加载完成
@@ -2221,10 +2240,13 @@ var WorkflowDocument = class extends FlowDocument {
2221
2240
  from: line.from.id,
2222
2241
  to: line.to.id
2223
2242
  }));
2224
- const startNodeId = allNode.find((node) => node.isStart).id;
2225
- const endNodeId = allNode.find((node) => node.isNodeEnd).id;
2243
+ const startNodeId = allNode.find((node) => node.isStart)?.id;
2244
+ const endNodeId = allNode.find((node) => node.isNodeEnd)?.id;
2226
2245
  const nodeInContainer = allNode.filter((node) => node.parent?.getNodeMeta().isContainer).map((node) => node.id);
2227
- const associatedCache = /* @__PURE__ */ new Set([endNodeId, ...nodeInContainer]);
2246
+ const associatedCache = new Set(nodeInContainer);
2247
+ if (endNodeId) {
2248
+ associatedCache.add(endNodeId);
2249
+ }
2228
2250
  const bfs = (nodeId) => {
2229
2251
  if (associatedCache.has(nodeId)) {
2230
2252
  return;
@@ -2238,7 +2260,9 @@ var WorkflowDocument = class extends FlowDocument {
2238
2260
  }, []);
2239
2261
  nextNodes.forEach(bfs);
2240
2262
  };
2241
- bfs(startNodeId);
2263
+ if (startNodeId) {
2264
+ bfs(startNodeId);
2265
+ }
2242
2266
  const associatedNodes = allNode.filter((node) => associatedCache.has(node.id));
2243
2267
  return associatedNodes;
2244
2268
  }
@@ -2360,6 +2384,11 @@ var WorkflowDocument = class extends FlowDocument {
2360
2384
  * 导出数据
2361
2385
  */
2362
2386
  toJSON() {
2387
+ if (this.disposed) {
2388
+ throw new Error(
2389
+ "The WorkflowDocument has been disposed and it is no longer possible to call toJSON."
2390
+ );
2391
+ }
2363
2392
  const rootJSON = this.toNodeJSON(this.root);
2364
2393
  const json = {
2365
2394
  nodes: rootJSON.blocks ?? [],
@@ -2440,7 +2469,8 @@ var WorkflowDocument = class extends FlowDocument {
2440
2469
  from: json.sourceNodeID,
2441
2470
  fromPort: json.sourcePortID,
2442
2471
  to: json.targetNodeID,
2443
- toPort: json.targetPortID
2472
+ toPort: json.targetPortID,
2473
+ data: json.data
2444
2474
  };
2445
2475
  if (!parentId) {
2446
2476
  return this.linesManager.createLine(lineInfo);
@@ -2505,10 +2535,10 @@ function checkDragSuccess(time, e, originLine) {
2505
2535
  }
2506
2536
  var WorkflowDragService = class {
2507
2537
  constructor() {
2508
- this._onDragLineEventEmitter = new Emitter5();
2538
+ this._onDragLineEventEmitter = new Emitter6();
2509
2539
  this.onDragLineEventChange = this._onDragLineEventEmitter.event;
2510
2540
  this.isDragging = false;
2511
- this._nodesDragEmitter = new Emitter5();
2541
+ this._nodesDragEmitter = new Emitter6();
2512
2542
  this.onNodesDrag = this._nodesDragEmitter.event;
2513
2543
  this._toDispose = new DisposableCollection2();
2514
2544
  this._droppableTransforms = [];
@@ -2910,7 +2940,8 @@ var WorkflowDragService = class {
2910
2940
  line = this.linesManager.createLine({
2911
2941
  from: fromPort.node.id,
2912
2942
  fromPort: fromPort.portID,
2913
- drawingTo: config.getPosFromMouseEvent(event)
2943
+ drawingTo: config.getPosFromMouseEvent(event),
2944
+ data: originLine?.lineData
2914
2945
  });
2915
2946
  if (!line) {
2916
2947
  return;
@@ -2991,7 +3022,8 @@ var WorkflowDragService = class {
2991
3022
  from: fromPort.node.id,
2992
3023
  fromPort: fromPort.portID,
2993
3024
  to: toPort.node.id,
2994
- toPort: toPort.portID
3025
+ toPort: toPort.portID,
3026
+ data: originLine?.lineData
2995
3027
  } : void 0;
2996
3028
  const isReset = originLine && toPort;
2997
3029
  if (isReset && !this.linesManager.canReset(
@@ -3104,7 +3136,7 @@ WorkflowDragService = __decorateClass([
3104
3136
  import { inject as inject7, injectable as injectable7, postConstruct as postConstruct3 } from "inversify";
3105
3137
  import { PlaygroundConfigEntity as PlaygroundConfigEntity6 } from "@flowgram.ai/core";
3106
3138
  import { EntityManager as EntityManager3 } from "@flowgram.ai/core";
3107
- import { DisposableCollection as DisposableCollection3, Emitter as Emitter6 } from "@flowgram.ai/utils";
3139
+ import { DisposableCollection as DisposableCollection3, Emitter as Emitter7 } from "@flowgram.ai/utils";
3108
3140
 
3109
3141
  // src/utils/layout-to-positions.ts
3110
3142
  import { FlowNodeTransformData as FlowNodeTransformData7 } from "@flowgram.ai/document";
@@ -3149,7 +3181,7 @@ var layoutToPositions = async (nodes, nodePositionMap) => {
3149
3181
  // src/service/workflow-reset-layout-service.ts
3150
3182
  var WorkflowResetLayoutService = class {
3151
3183
  constructor() {
3152
- this._resetLayoutEmitter = new Emitter6();
3184
+ this._resetLayoutEmitter = new Emitter7();
3153
3185
  /**
3154
3186
  * reset layout事件
3155
3187
  */
@@ -3208,13 +3240,13 @@ WorkflowResetLayoutService = __decorateClass([
3208
3240
 
3209
3241
  // src/service/workflow-operation-base-service.ts
3210
3242
  import { inject as inject8 } from "inversify";
3211
- import { Emitter as Emitter7 } from "@flowgram.ai/utils";
3243
+ import { Emitter as Emitter8 } from "@flowgram.ai/utils";
3212
3244
  import { FlowOperationBaseServiceImpl } from "@flowgram.ai/document";
3213
3245
  import { TransformData as TransformData10 } from "@flowgram.ai/core";
3214
3246
  var WorkflowOperationBaseServiceImpl = class extends FlowOperationBaseServiceImpl {
3215
3247
  constructor() {
3216
3248
  super(...arguments);
3217
- this.onNodePostionUpdateEmitter = new Emitter7();
3249
+ this.onNodePostionUpdateEmitter = new Emitter8();
3218
3250
  this.onNodePostionUpdate = this.onNodePostionUpdateEmitter.event;
3219
3251
  }
3220
3252
  updateNodePosition(nodeOrId, position) {