@flowgram.ai/free-layout-core 0.1.0-alpha.18 → 0.1.0-alpha.19

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.
Files changed (32) hide show
  1. package/dist/esm/{chunk-O4WKIIW2.js → chunk-3UW6BHP2.js} +1 -1
  2. package/dist/esm/chunk-3UW6BHP2.js.map +1 -0
  3. package/dist/esm/index.js +161 -55
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/typings/index.js +1 -1
  6. package/dist/esm/typings/workflow-operation.js +1 -1
  7. package/dist/index.d.mts +7 -5
  8. package/dist/index.d.ts +7 -5
  9. package/dist/index.js +159 -50
  10. package/dist/index.js.map +1 -1
  11. package/dist/typings/index.d.mts +1 -1
  12. package/dist/typings/index.d.ts +1 -1
  13. package/dist/typings/index.js.map +1 -1
  14. package/dist/typings/workflow-drag.d.mts +1 -1
  15. package/dist/typings/workflow-drag.d.ts +1 -1
  16. package/dist/typings/workflow-json.d.mts +1 -1
  17. package/dist/typings/workflow-json.d.ts +1 -1
  18. package/dist/typings/workflow-line.d.mts +1 -1
  19. package/dist/typings/workflow-line.d.ts +1 -1
  20. package/dist/typings/workflow-node.d.mts +1 -1
  21. package/dist/typings/workflow-node.d.ts +1 -1
  22. package/dist/typings/workflow-operation.d.mts +9 -0
  23. package/dist/typings/workflow-operation.d.ts +9 -0
  24. package/dist/typings/workflow-operation.js.map +1 -1
  25. package/dist/typings/workflow-registry.d.mts +1 -1
  26. package/dist/typings/workflow-registry.d.ts +1 -1
  27. package/dist/typings/workflow-sub-canvas.d.mts +1 -1
  28. package/dist/typings/workflow-sub-canvas.d.ts +1 -1
  29. package/dist/{workflow-node-entity-B-9mEm2k.d.mts → workflow-node-entity-DH5qlw7I.d.mts} +41 -7
  30. package/dist/{workflow-node-entity-DvBGZ5Ve.d.ts → workflow-node-entity-DWVtlA2a.d.ts} +41 -7
  31. package/package.json +9 -9
  32. package/dist/esm/chunk-O4WKIIW2.js.map +0 -1
@@ -15,7 +15,7 @@ import {
15
15
  import "../chunk-DDJTYHXN.js";
16
16
  import {
17
17
  WorkflowOperationBaseService
18
- } from "../chunk-O4WKIIW2.js";
18
+ } from "../chunk-3UW6BHP2.js";
19
19
  import "../chunk-EUXUH3YW.js";
20
20
  export {
21
21
  LineColors,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  WorkflowOperationBaseService
3
- } from "../chunk-O4WKIIW2.js";
3
+ } from "../chunk-3UW6BHP2.js";
4
4
  import "../chunk-EUXUH3YW.js";
5
5
  export {
6
6
  WorkflowOperationBaseService
package/dist/index.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { PlaygroundConfigEntity, CommandService, PlaygroundDragEvent, EntityData } from '@flowgram.ai/core';
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
- import { FlowOperationBaseService, FlowNodeType, FlowOperationBaseServiceImpl, FlowNodeEntityOrId, FlowNodeEntity } from '@flowgram.ai/document';
5
- import { W as WorkflowJSON, L as LineCenterPoint, a as WorkflowDocument, b as WorkflowNodeEntity, c as WorkflowHoverService, d as WorkflowLinesManager, e as WorkflowSelectService, f as WorkflowDocumentOptions, g as LineEventProps, N as NodesDragEvent, h as WorkflowNodeJSON, i as WorkflowPortEntity, j as WorkflowLineEntity, O as OnDragLineEnd, k as LineRenderType, l as WorkflowLineRenderContribution, m as LinePosition } from './workflow-node-entity-B-9mEm2k.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-B-9mEm2k.mjs';
4
+ import { FlowNodeType, FlowOperationBaseServiceImpl, FlowNodeEntityOrId, FlowNodeEntity } from '@flowgram.ai/document';
5
+ import { W as WorkflowJSON, L as LineCenterPoint, a as WorkflowDocument, b as WorkflowNodeEntity, c as WorkflowHoverService, d as WorkflowLinesManager, e as WorkflowSelectService, f as WorkflowDocumentOptions, g as LineEventProps, N as NodesDragEvent, h as WorkflowNodeJSON, i as WorkflowPortEntity, j as WorkflowLineEntity, O as OnDragLineEnd, k as LineRenderType, l as WorkflowLineRenderContribution, m as LinePosition } from './workflow-node-entity-DH5qlw7I.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-DH5qlw7I.mjs';
7
7
  import * as _flowgram_ai_utils from '@flowgram.ai/utils';
8
8
  import { IPoint, Rectangle, DisposableCollection, Disposable } from '@flowgram.ai/utils';
9
9
  export { compose, composeAsync, delay } from '@flowgram.ai/utils';
@@ -75,7 +75,7 @@ declare class WorkflowDragService {
75
75
  protected linesManager: WorkflowLinesManager;
76
76
  protected commandService: CommandService;
77
77
  protected selectService: WorkflowSelectService;
78
- protected operationService: FlowOperationBaseService;
78
+ protected operationService: WorkflowOperationBaseService;
79
79
  readonly options: WorkflowDocumentOptions;
80
80
  private _onDragLineEventEmitter;
81
81
  readonly onDragLineEventChange: _flowgram_ai_utils.Event<LineEventProps>;
@@ -228,9 +228,11 @@ declare class WorkflowResetLayoutService {
228
228
 
229
229
  declare class WorkflowOperationBaseServiceImpl extends FlowOperationBaseServiceImpl implements WorkflowOperationBaseService {
230
230
  protected document: WorkflowDocument;
231
+ linesManager: WorkflowLinesManager;
231
232
  private onNodePostionUpdateEmitter;
232
233
  readonly onNodePostionUpdate: _flowgram_ai_utils.Event<NodePostionUpdateEvent>;
233
234
  updateNodePosition(nodeOrId: FlowNodeEntityOrId, position: IPoint): void;
235
+ fromJSON(json: WorkflowJSON): void;
234
236
  }
235
237
 
236
238
  /**
@@ -355,7 +357,7 @@ interface NodeRenderReturnType {
355
357
  * 更新节点的扩展数据
356
358
  * @param extInfo
357
359
  */
358
- updateExtInfo<T = any>(extInfo: T): void;
360
+ updateExtInfo<T = any>(extInfo: T, fullUpdate?: boolean): void;
359
361
  /**
360
362
  * 展开/收起节点
361
363
  * @param expanded
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { PlaygroundConfigEntity, CommandService, PlaygroundDragEvent, EntityData } from '@flowgram.ai/core';
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
- import { FlowOperationBaseService, FlowNodeType, FlowOperationBaseServiceImpl, FlowNodeEntityOrId, FlowNodeEntity } from '@flowgram.ai/document';
5
- import { W as WorkflowJSON, L as LineCenterPoint, a as WorkflowDocument, b as WorkflowNodeEntity, c as WorkflowHoverService, d as WorkflowLinesManager, e as WorkflowSelectService, f as WorkflowDocumentOptions, g as LineEventProps, N as NodesDragEvent, h as WorkflowNodeJSON, i as WorkflowPortEntity, j as WorkflowLineEntity, O as OnDragLineEnd, k as LineRenderType, l as WorkflowLineRenderContribution, m as LinePosition } from './workflow-node-entity-DvBGZ5Ve.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-DvBGZ5Ve.js';
4
+ import { FlowNodeType, FlowOperationBaseServiceImpl, FlowNodeEntityOrId, FlowNodeEntity } from '@flowgram.ai/document';
5
+ import { W as WorkflowJSON, L as LineCenterPoint, a as WorkflowDocument, b as WorkflowNodeEntity, c as WorkflowHoverService, d as WorkflowLinesManager, e as WorkflowSelectService, f as WorkflowDocumentOptions, g as LineEventProps, N as NodesDragEvent, h as WorkflowNodeJSON, i as WorkflowPortEntity, j as WorkflowLineEntity, O as OnDragLineEnd, k as LineRenderType, l as WorkflowLineRenderContribution, m as LinePosition } from './workflow-node-entity-DWVtlA2a.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-DWVtlA2a.js';
7
7
  import * as _flowgram_ai_utils from '@flowgram.ai/utils';
8
8
  import { IPoint, Rectangle, DisposableCollection, Disposable } from '@flowgram.ai/utils';
9
9
  export { compose, composeAsync, delay } from '@flowgram.ai/utils';
@@ -75,7 +75,7 @@ declare class WorkflowDragService {
75
75
  protected linesManager: WorkflowLinesManager;
76
76
  protected commandService: CommandService;
77
77
  protected selectService: WorkflowSelectService;
78
- protected operationService: FlowOperationBaseService;
78
+ protected operationService: WorkflowOperationBaseService;
79
79
  readonly options: WorkflowDocumentOptions;
80
80
  private _onDragLineEventEmitter;
81
81
  readonly onDragLineEventChange: _flowgram_ai_utils.Event<LineEventProps>;
@@ -228,9 +228,11 @@ declare class WorkflowResetLayoutService {
228
228
 
229
229
  declare class WorkflowOperationBaseServiceImpl extends FlowOperationBaseServiceImpl implements WorkflowOperationBaseService {
230
230
  protected document: WorkflowDocument;
231
+ linesManager: WorkflowLinesManager;
231
232
  private onNodePostionUpdateEmitter;
232
233
  readonly onNodePostionUpdate: _flowgram_ai_utils.Event<NodePostionUpdateEvent>;
233
234
  updateNodePosition(nodeOrId: FlowNodeEntityOrId, position: IPoint): void;
235
+ fromJSON(json: WorkflowJSON): void;
234
236
  }
235
237
 
236
238
  /**
@@ -355,7 +357,7 @@ interface NodeRenderReturnType {
355
357
  * 更新节点的扩展数据
356
358
  * @param extInfo
357
359
  */
358
- updateExtInfo<T = any>(extInfo: T): void;
360
+ updateExtInfo<T = any>(extInfo: T, fullUpdate?: boolean): void;
359
361
  /**
360
362
  * 展开/收起节点
361
363
  * @param expanded
package/dist/index.js CHANGED
@@ -225,6 +225,27 @@ var import_core5 = require("@flowgram.ai/core");
225
225
  var import_utils5 = require("@flowgram.ai/utils");
226
226
  var import_document3 = require("@flowgram.ai/document");
227
227
  var import_core4 = require("@flowgram.ai/core");
228
+
229
+ // src/utils/location-config-to-point.ts
230
+ function locationConfigToPoint(bounds, config, _offset = { x: 0, y: 0 }) {
231
+ const offset = { ..._offset };
232
+ if (config.left !== void 0) {
233
+ offset.x += typeof config.left === "string" ? parseFloat(config.left) * 0.01 * bounds.width : config.left;
234
+ } else if (config.right !== void 0) {
235
+ offset.x += bounds.width - (typeof config.right === "string" ? parseFloat(config.right) * 0.01 * bounds.width : config.right);
236
+ }
237
+ if (config.top !== void 0) {
238
+ offset.y += typeof config.top === "string" ? parseFloat(config.top) * 0.01 * bounds.height : config.top;
239
+ } else if (config.bottom !== void 0) {
240
+ offset.y += bounds.height - (typeof config.bottom === "string" ? parseFloat(config.bottom) * 0.01 * bounds.height : config.bottom);
241
+ }
242
+ return {
243
+ x: bounds.x + offset.x,
244
+ y: bounds.y + offset.y
245
+ };
246
+ }
247
+
248
+ // src/entities/workflow-port-entity.ts
228
249
  var PORT_SIZE = 24;
229
250
  var WorkflowPortEntity = class extends import_core4.Entity {
230
251
  constructor(opts) {
@@ -237,6 +258,7 @@ var WorkflowPortEntity = class extends import_core4.Entity {
237
258
  this.portType = opts.type;
238
259
  this._disabled = opts.disabled;
239
260
  this._offset = opts.offset;
261
+ this._locationConfig = opts.locationConfig;
240
262
  this._location = opts.location;
241
263
  this._size = opts.size;
242
264
  this.node = opts.node;
@@ -284,7 +306,7 @@ var WorkflowPortEntity = class extends import_core4.Entity {
284
306
  return "right";
285
307
  }
286
308
  get point() {
287
- const { targetElement } = this;
309
+ const { targetElement, _locationConfig } = this;
288
310
  const { bounds } = this.node.getData(import_document3.FlowNodeTransformData);
289
311
  const location2 = this.location;
290
312
  if (targetElement) {
@@ -299,8 +321,14 @@ var WorkflowPortEntity = class extends import_core4.Entity {
299
321
  location: location2
300
322
  };
301
323
  }
302
- let point = { x: 0, y: 0 };
324
+ if (_locationConfig) {
325
+ return {
326
+ ...locationConfigToPoint(bounds, _locationConfig, this._offset),
327
+ location: location2
328
+ };
329
+ }
303
330
  const offset = this._offset || { x: 0, y: 0 };
331
+ let point = { x: 0, y: 0 };
304
332
  switch (location2) {
305
333
  case "left":
306
334
  point = bounds.leftCenter;
@@ -413,6 +441,10 @@ var WorkflowPortEntity = class extends import_core4.Entity {
413
441
  this._offset = data.offset;
414
442
  changed = true;
415
443
  }
444
+ if (import_utils5.Compare.isChanged(data.locationConfig, this._locationConfig)) {
445
+ this._locationConfig = data.locationConfig;
446
+ changed = true;
447
+ }
416
448
  if (import_utils5.Compare.isChanged(data.size, this._size)) {
417
449
  this._size = data.size;
418
450
  changed = true;
@@ -1513,10 +1545,11 @@ function initFormDataFromJSON(node, json, isFirstCreate) {
1513
1545
  // src/workflow-document-option.ts
1514
1546
  var WorkflowDocumentOptions = Symbol("WorkflowDocumentOptions");
1515
1547
  var WorkflowDocumentOptionsDefault = {
1516
- cursors: {
1517
- grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
1518
- grabbing: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto'
1519
- },
1548
+ // cursors: {
1549
+ // grab: 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40ODczIDIuNjIzNzhDOS45MDczMSAyLjYyMzc4IDkuNDM3MTMgMy4wOTM5NiA5LjQzNzEzIDMuNjczOTZWNS4xNDM3NkM5LjM5NDI4IDQuNDAyNzQgOC43Nzk3OCAzLjgxNTA0IDguMDI4MDIgMy44MTUwNEM3LjI0ODQ4IDMuODE1MDQgNi42MTY1MyA0LjQ0Njk5IDYuNjE2NTMgNS4yMjY1M1YxMS44Mjg5TDUuNjc0MTggMTEuMDA0OUM1LjE1NDg3IDEwLjU1MDkgNC40MDk1IDEwLjQ2MzYgMy43OTkzOCAxMC43ODU1TDMuNjk2OTQgMTAuODM5NkMzLjA2MjE3IDExLjE3NDUgMi45MjI2IDEyLjAyMjggMy40MTY2MiAxMi41NDM0TDcuMzM5NTkgMTYuNjc3NVYxNy4zMjU5QzcuMzM5NTkgMTcuNzg2MiA3LjcxMjY5IDE4LjE1OTMgOC4xNzI5MiAxOC4xNTkzSDEzLjgwODRDMTQuMjY4NyAxOC4xNTkzIDE0LjY0MTcgMTcuNzg2MiAxNC42NDE3IDE3LjMyNTlWMTYuNzkzNUMxNS44MDk0IDE1LjY0ODUgMTYuNDY3MyAxNC4wODE5IDE2LjQ2NzMgMTIuNDQ2NVYxMS40OTY3TDE2LjQ2NzEgNi42MzY4NUMxNi40NjcxIDUuOTU2MyAxNS45MTU0IDUuNDA0NjEgMTUuMjM0OCA1LjQwNDYxQzE0LjU1NDMgNS40MDQ2MSAxNC4wMDI2IDUuOTU2MyAxNC4wMDI2IDYuNjM2ODVMMTQuMDAyMSA1LjA0NzI4QzE0LjAwMjEgNC4zNjY3MyAxMy40NTA0IDMuODE1MDQgMTIuNzY5OCAzLjgxNTA0QzEyLjA4OTMgMy44MTUwNCAxMS41Mzc2IDQuMzY2NzMgMTEuNTM3NiA1LjA0NzI4TDExLjUzNzUgMy42NzM5NUMxMS41Mzc1IDMuMDkzOTYgMTEuMDY3MyAyLjYyMzc4IDEwLjQ4NzMgMi42MjM3OFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3NCAxLjM3NDAyQzExLjM2MTIgMS4zNzQwMiAxMi4xMjExIDEuODYxMTggMTIuNTEwNSAyLjU3ODY4QzEyLjU5NTggMi41Njk4MyAxMi42ODIzIDIuNTY1MjggMTIuNzcgMi41NjUyOEMxMy44Mjc4IDIuNTY1MjggMTQuNzMxMSAzLjIyNzAxIDE1LjA4ODUgNC4xNTkxMUMxNS4xMzcgNC4xNTYyOSAxNS4xODU4IDQuMTU0ODYgMTUuMjM1IDQuMTU0ODZDMTYuNjA1OSA0LjE1NDg2IDE3LjcxNzIgNS4yNjYxOSAxNy43MTcyIDYuNjM3MDlMMTcuNzE3NCAxMi40NDY3QzE3LjcxNzQgMTQuMjM1NSAxNy4wNjQ0IDE1Ljk1NTkgMTUuODkxOSAxNy4yOTA0VjE3LjMyNjJDMTUuODkxOSAxOC40NzY4IDE0Ljk1OTEgMTkuNDA5NSAxMy44MDg1IDE5LjQwOTVIOC4xNzMwNkM3LjAyMjQ3IDE5LjQwOTUgNi4wODk3MyAxOC40NzY4IDYuMDg5NzMgMTcuMzI2MlYxNy4xNzY0TDIuNTEwMDMgMTMuNDA0MUMxLjQ0NTk5IDEyLjI4MjggMS43NDY2IDEwLjQ1NTUgMy4xMTM3OSA5LjczNDI0TDMuMjE2MjQgOS42ODAxOUMzLjg5MTY4IDkuMzIzODMgNC42NjE4NSA5LjI1NDAxIDUuMzY2NjYgOS40NTE5OFY1LjIyNjc4QzUuMzY2NjYgMy43NTY4NyA2LjU1ODI2IDIuNTY1MjggOC4wMjgxNiAyLjU2NTI4QzguMTcyOTMgMi41NjUyOCA4LjMxNDk5IDIuNTc2ODQgOC40NTM0NyAyLjU5OTA3QzguODM5NDMgMS44NzA0MiA5LjYwNTQ2IDEuMzc0MDIgMTAuNDg3NCAxLjM3NDAyWk0xMi40NDc2IDMuODU3ODdWOS40NzY0NkMxMi40NDc2IDkuNzI4NTIgMTIuMjQzMyA5LjkzMjg1IDExLjk5MTMgOS45MzI4NUMxMS43MzkyIDkuOTMyODUgMTEuNTM0OSA5LjcyODUyIDExLjUzNDkgOS40NzY0NlYzLjc5NjU1QzExLjUzNDkgMy43Nzk1NiAxMS41MzU4IDMuNzYyNzcgMTEuNTM3NiAzLjc0NjI2VjMuNjc0MkMxMS41Mzc2IDMuNDMyODIgMTEuNDU2MiAzLjIxMDQ2IDExLjMxOTMgMy4wMzMwOUMxMS4xMjcyIDIuNzg0MjggMTAuODI2MSAyLjYyNDAyIDEwLjQ4NzQgMi42MjQwMkMxMC4xMjM4IDIuNjI0MDIgOS44MDMzMiAyLjgwODg2IDkuNjE0ODMgMy4wODk3QzkuNTAyNjkgMy4yNTY3OSA5LjQzNzI2IDMuNDU3ODUgOS40MzcyNiAzLjY3NDJWMy43ODU3M0M5LjQzNzM1IDMuNzg5MzMgOS40MzczOSAzLjc5Mjk0IDkuNDM3MzkgMy43OTY1NVY5LjkwMTdDOS40MzczOSAxMC4xNTM3IDkuMjMzMDYgMTAuMzU4MSA4Ljk4MTAxIDEwLjM1ODFDOC43Mjg5NSAxMC4zNTgxIDguNTI0NjIgMTAuMTUzNyA4LjUyNDYyIDkuOTAxN1YzLjkwNTA3QzguNDE3NzMgMy44NjQ5IDguMzA0NjggMy44MzczMiA4LjE4NzI2IDMuODI0MTVDOC4xMzUwNCAzLjgxODI5IDguMDgxOTUgMy44MTUyOCA4LjAyODE2IDMuODE1MjhDNy4yNDg2MSAzLjgxNTI4IDYuNjE2NjYgNC40NDcyMyA2LjYxNjY2IDUuMjI2NzhWMTEuODI5Mkw1LjY3NDMxIDExLjAwNTJDNS41Nzg2OCAxMC45MjE2IDUuNDc1MzcgMTAuODUwNCA1LjM2NjY2IDEwLjc5MTlDNC44ODUwNiAxMC41MzI5IDQuMjk3MjggMTAuNTIzMSAzLjc5OTUyIDEwLjc4NThMMy42OTcwNyAxMC44Mzk4QzMuMDYyMzEgMTEuMTc0NyAyLjkyMjczIDEyLjAyMzEgMy40MTY3NSAxMi41NDM3TDcuMzM5NzMgMTYuNjc3N1YxNy4zMjYyQzcuMzM5NzMgMTcuNzg2NCA3LjcxMjgyIDE4LjE1OTUgOC4xNzMwNiAxOC4xNTk1SDEzLjgwODVDMTQuMjY4OCAxOC4xNTk1IDE0LjY0MTkgMTcuNzg2NCAxNC42NDE5IDE3LjMyNjJWMTYuNzkzOEMxNS43Mzc5IDE1LjcxOSAxNi4zODQ3IDE0LjI3MjggMTYuNDYgMTIuNzQ3QzE2LjQ2NDEgMTIuNjY0MSAxNi40NjY1IDEyLjU4MDkgMTYuNDY3MiAxMi40OTc1TDE2LjQ2NzQgMTIuNDQ2N0wxNi40NjcyIDYuNjM3MDlDMTYuNDY3MiA1Ljk2MjMgMTUuOTI0OCA1LjQxNDE5IDE1LjI1MjIgNS40MDQ5N0wxNS4yMzUgNS40MDQ4NkMxNS4xMjQ2IDUuNDA0ODYgMTUuMDE3NyA1LjQxOTM2IDE0LjkxNTkgNS40NDY1NlY5LjYwMjI2QzE0LjkxNTkgOS44NTQzMSAxNC43MTE2IDEwLjA1ODYgMTQuNDU5NSAxMC4wNTg2QzE0LjIwNzUgMTAuMDU4NiAxNC4wMDMxIDkuODU0MzEgMTQuMDAzMSA5LjYwMjI2VjYuNjA1MTRDMTQuMDAyOSA2LjYxNTc2IDE0LjAwMjcgNi42MjY0MSAxNC4wMDI3IDYuNjM3MDlWOS4yNzcwNUwxNC4wMDIyIDUuMDQ3NTJDMTQuMDAyMiA0Ljg2OTEzIDEzLjk2NDMgNC42OTk2IDEzLjg5NjEgNC41NDY1M0MxMy43MDY0IDQuMTIwNzIgMTMuMjgyMiAzLjgyMjM1IDEyLjc4NzYgMy44MTU0MUwxMi43NyAzLjgxNTI4QzEyLjY1ODQgMy44MTUyOCAxMi41NTA0IDMuODMwMSAxMi40NDc2IDMuODU3ODdaIiBmaWxsPSIjMUQxQzIzIi8+Cjwvc3ZnPg=="), auto',
1550
+ // grabbing:
1551
+ // 'url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik02LjYxODE3IDUuNTk4NzVDNi42MTgxNyA0LjgxOTIgNy4yNTAxMiA0LjE4NzI2IDguMDI5NjcgNC4xODcyNkM4Ljc3ODczIDQuMTg3MjYgOS4zOTE1MiA0Ljc3MDc1IDkuNDM4MjkgNS41MDgwMUM5LjQ1OTkyIDQuOTQ3MSA5LjkyMTQ3IDQuNDk5MDIgMTAuNDg3NyA0LjQ5OTAyQzExLjA2NzcgNC40OTkwMiAxMS41Mzc4IDQuOTY5MiAxMS41Mzc4IDUuNTQ5MTlWOC43NjI0NkwxMS41Mzc5IDYuNzExNUMxMS41Mzc5IDYuMDMwOTUgMTIuMDg5NiA1LjQ3OTI2IDEyLjc3MDIgNS40NzkyNkMxMy40NTA3IDUuNDc5MjYgMTQuMDAyNCA2LjAzMDk1IDE0LjAwMjQgNi43MTE1TDE0LjAwMjQgOC43NjI0NkwxNC4wMDI5IDguMDE5ODNDMTQuMDAyOSA3LjMzOTI5IDE0LjU1NDYgNi43ODc1OSAxNS4yMzUyIDYuNzg3NTlDMTUuOTE1NyA2Ljc4NzU5IDE2LjQ2NzQgNy4zMzkyOCAxNi40Njc0IDguMDE5ODNWMTEuNDk3TDE2LjQ2NzUgMTIuNDQ2N0MxNi40Njc1IDE0LjA4MjEgMTUuODA5NiAxNS42NDg3IDE0LjY0MiAxNi43OTM4VjE3LjMyNjJDMTQuNjQyIDE3Ljc4NjQgMTQuMjY4OSAxOC4xNTk1IDEzLjgwODcgMTguMTU5NUg4LjE3MzE3QzcuNzEyOTMgMTguMTU5NSA3LjMzOTg0IDE3Ljc4NjQgNy4zMzk4NCAxNy4zMjYyVjE1Ljk0MjRMNS4zNDU2MiAxNC43NTM0QzQuNTg5MjQgMTQuMzAyNCA0LjEyNTkxIDEzLjQ4NjcgNC4xMjU4OSAxMi42MDYxTDQuMTI1ODMgOS4yODM4M0M0LjEyNTgyIDguOTU0MjcgNC4zMjAwMyA4LjY1NTY2IDQuNjIxMjkgOC41MjIwNUw2LjYxODE3IDcuNjM2MzRWNS41OTg3NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAuNDg3OCAzLjI0OTAyQzExLjI3OTYgMy4yNDkwMiAxMS45Nzc4IDMuNjQ5MDIgMTIuMzkxNyA0LjI1Nzk2QzEyLjUxNTEgNC4yMzkwNiAxMi42NDE2IDQuMjI5MjYgMTIuNzcwMyA0LjIyOTI2QzEzLjcyMjQgNC4yMjkyNiAxNC41NDkzIDQuNzY1MzEgMTQuOTY1NyA1LjU1MjA3QzE1LjA1NDMgNS41NDI1IDE1LjE0NDIgNS41Mzc1OSAxNS4yMzUzIDUuNTM3NTlDMTYuNjA2MiA1LjUzNzU5IDE3LjcxNzYgNi42NDg5MyAxNy43MTc2IDguMDE5ODNMMTcuNzE3NyAxMi40NDY3QzE3LjcxNzcgMTQuMjM1NSAxNy4wNjQ3IDE1Ljk1NTkgMTUuODkyMSAxNy4yOTA0VjE3LjMyNjJDMTUuODkyMSAxOC40NzY4IDE0Ljk1OTQgMTkuNDA5NSAxMy44MDg4IDE5LjQwOTVIOC4xNzMzMkM3LjAyMjczIDE5LjQwOTUgNi4wODk5OCAxOC40NzY4IDYuMDg5OTggMTcuMzI2MlYxNi42NTI0TDQuNzA1NjMgMTUuODI3QzMuNTcxMDYgMTUuMTUwNSAyLjg3NjA3IDEzLjkyNzEgMi44NzYwNCAxMi42MDYxTDIuODc1OTggOS4yODM4NUMyLjg3NTk2IDguNDU5OTYgMy4zNjE0OSA3LjcxMzQ1IDQuMTE0NjIgNy4zNzk0TDUuMzY4MzIgNi44MjMzM1Y1LjU5ODc1QzUuMzY4MzIgNC4xMjg4NSA2LjU1OTkxIDIuOTM3MjYgOC4wMjk4MiAyLjkzNzI2QzguNjA4MzEgMi45MzcyNiA5LjE0MzU1IDMuMTIxNyA5LjU4MDA1IDMuNDM1MDVDOS44NTg1MyAzLjMxNTMyIDEwLjE2NTQgMy4yNDkwMiAxMC40ODc4IDMuMjQ5MDJaTTEyLjQ0NzkgNS41MjE4NlY5LjQ3NTU3QzEyLjQ0NzkgOS43Mjc2MiAxMi4yNDM2IDkuOTMxOTUgMTEuOTkxNiA5LjkzMTk1QzExLjc1NjggOS45MzE5NSAxMS41NjM0IDkuNzU0NjUgMTEuNTM4IDkuNTI2NjNDMTEuNTM2MSA5LjUwOTg3IDExLjUzNTIgOS40OTI4MyAxMS41MzUyIDkuNDc1NTdWNS40NzE1OEMxMS41MTU0IDUuMjAwODMgMTEuMzkzIDQuOTU4NTggMTEuMjA2NiA0Ljc4MzU4QzExLjAxODggNC42MDcxMSAxMC43NjU5IDQuNDk5MDIgMTAuNDg3OCA0LjQ5OTAyQzEwLjQ3NjYgNC40OTkwMiAxMC40NjU0IDQuNDk5MTkgMTAuNDU0MiA0LjQ5OTU0QzkuOTAzNDcgNC41MTY4NCA5LjQ1OTY0IDQuOTU4MjQgOS40Mzg0NCA1LjUwODAxQzkuNDM4MiA1LjUwNDMgOS40Mzc5NSA1LjUwMDU4IDkuNDM3NjkgNS40OTY4OFY5LjkwMjQzQzkuNDM3NjkgMTAuMTU0NSA5LjIzMzM2IDEwLjM1ODggOC45ODEzMSAxMC4zNTg4QzguNzI5MjUgMTAuMzU4OCA4LjUyNDkyIDEwLjE1NDUgOC41MjQ5MiA5LjkwMjQzVjQuMjc2NTNDOC4zNzA4NiA0LjIxODgyIDguMjA0MDIgNC4xODcyNiA4LjAyOTgyIDQuMTg3MjZDNy4yNTAyNyA0LjE4NzI2IDYuNjE4MzIgNC44MTkyIDYuNjE4MzIgNS41OTg3NUw2LjYxODI3IDkuOTc1OTlDNi42MTgyNyAxMC4yMjggNi40MTM5NCAxMC40MzI0IDYuMTYxODkgMTAuNDMyNEM1LjkwOTgzIDEwLjQzMjQgNS43MDU1IDEwLjIyOCA1LjcwNTUgOS45NzU5OVY4LjA0MTIyTDQuNjIxNDQgOC41MjIwNUM0LjMyMDE4IDguNjU1NjYgNC4xMjU5NyA4Ljk1NDI3IDQuMTI1OTggOS4yODM4M0w0LjEyNjA0IDEyLjYwNjFDNC4xMjYwNiAxMy40ODY3IDQuNTg5MzkgMTQuMzAyNCA1LjM0NTc2IDE0Ljc1MzRMNy4zMzk5OCAxNS45NDI0VjE3LjMyNjJDNy4zMzk5OCAxNy43ODY0IDcuNzEzMDggMTguMTU5NSA4LjE3MzMyIDE4LjE1OTVIMTMuODA4OEMxNC4yNjkgMTguMTU5NSAxNC42NDIxIDE3Ljc4NjQgMTQuNjQyMSAxNy4zMjYyVjE2Ljc5MzhDMTUuNzM4MSAxNS43MTkgMTYuMzg1IDE0LjI3MjggMTYuNDYwMyAxMi43NDdDMTYuNDY0NiAxMi42NiAxNi40NjcgMTIuNTcyOCAxNi40Njc2IDEyLjQ4NTRMMTYuNDY3NyAxMi40NDY3TDE2LjQ2NzYgOC4wMTk4M0MxNi40Njc2IDcuMzQ1MDQgMTUuOTI1MiA2Ljc5NjkzIDE1LjI1MjUgNi43ODc3MUwxNS4yMzUzIDYuNzg3NTlDMTUuMTI1IDYuNzg3NTkgMTUuMDE4IDYuODAyMSAxNC45MTYyIDYuODI5MzFWOS42MDEzNkMxNC45MTYyIDkuODUzNDIgMTQuNzExOSAxMC4wNTc3IDE0LjQ1OTggMTAuMDU3N0MxNC4yMDc4IDEwLjA1NzcgMTQuMDAzNCA5Ljg1MzQxIDE0LjAwMzQgOS42MDEzNlY3Ljk4OTg1QzE0LjAwMzIgNy45OTk4MiAxNC4wMDMxIDguMDA5ODEgMTQuMDAzMSA4LjAxOTgzTDE0LjAwMzQgOS42MDEzNkwxNC4wMDI1IDYuNzExNUMxNC4wMDI1IDYuNDQ5NzQgMTMuOTIwOSA2LjIwNzA1IDEzLjc4MTggNi4wMDc0OEMxMy41NjIgNS42OTI0MiAxMy4xOTg5IDUuNDg0ODMgMTIuNzg3IDUuNDc5MzdMMTIuNzcwMyA1LjQ3OTI2QzEyLjY1ODggNS40NzkyNiAxMi41NTA3IDUuNDk0MDggMTIuNDQ3OSA1LjUyMTg2WiIgZmlsbD0iIzFEMUMyMyIvPgo8L3N2Zz4="), auto',
1552
+ // },
1520
1553
  fromNodeJSON(node, json, isFirstCreate) {
1521
1554
  initFormDataFromJSON(node, json, isFirstCreate);
1522
1555
  return;
@@ -2104,6 +2137,9 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2104
2137
  this._loading = false;
2105
2138
  this.onLoadedEmitter.fire();
2106
2139
  }
2140
+ /**
2141
+ * @deprecated use `ctx.operation.fromJSON` instead
2142
+ */
2107
2143
  async reload(json, delayTime = 0) {
2108
2144
  if (this.disposed) return;
2109
2145
  this._loading = true;
@@ -2124,7 +2160,7 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2124
2160
  edges: json.edges ?? []
2125
2161
  };
2126
2162
  this.entityManager.changeEntityLocked = true;
2127
- this.renderJSON(workflowJSON);
2163
+ this.batchAddFromJSON(workflowJSON);
2128
2164
  this.entityManager.changeEntityLocked = false;
2129
2165
  this.transformer.loading = false;
2130
2166
  if (fireRender) {
@@ -2144,9 +2180,17 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2144
2180
  * 创建流程节点
2145
2181
  * @param json
2146
2182
  */
2147
- createWorkflowNode(json, isClone = false, parentId) {
2183
+ createWorkflowNode(json, isClone = false, parentID) {
2184
+ return this._createWorkflowNode(json, { parentID });
2185
+ }
2186
+ /**
2187
+ * 创建流程节点
2188
+ * @param json
2189
+ */
2190
+ _createWorkflowNode(json, options) {
2191
+ const { parentID, onNodeCreated, onEdgeCreated } = options ?? {};
2148
2192
  const isExistedNode = this.getNode(json.id);
2149
- const parent = this.getNode(parentId ?? this.root.id) ?? this.root;
2193
+ const parent = this.getNode(parentID ?? this.root.id) ?? this.root;
2150
2194
  const node = this.addNode(
2151
2195
  {
2152
2196
  ...json,
@@ -2173,15 +2217,19 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2173
2217
  node.getData(import_core14.TransformData).update({
2174
2218
  position
2175
2219
  });
2176
- if (formMeta && formData && !formData.formModel.initialized) {
2177
- formData.createForm(formMeta, json.data);
2178
- formData.onDataChange(() => {
2179
- this.fireContentChange({
2180
- type: "NODE_DATA_CHANGE" /* NODE_DATA_CHANGE */,
2181
- toJSON: () => formData.toJSON(),
2182
- entity: node
2220
+ if (formMeta && formData) {
2221
+ if (!formData.formModel.initialized) {
2222
+ formData.createForm(formMeta, json.data);
2223
+ formData.onDataChange(() => {
2224
+ this.fireContentChange({
2225
+ type: "NODE_DATA_CHANGE" /* NODE_DATA_CHANGE */,
2226
+ toJSON: () => formData.toJSON(),
2227
+ entity: node
2228
+ });
2183
2229
  });
2184
- });
2230
+ } else {
2231
+ formData.updateFormValues(json.data);
2232
+ }
2185
2233
  }
2186
2234
  const positionData = node.getData(import_core14.PositionData);
2187
2235
  if (!isExistedNode) {
@@ -2220,11 +2268,12 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2220
2268
  });
2221
2269
  }
2222
2270
  if (json.blocks) {
2223
- this.renderJSON(
2271
+ this.batchAddFromJSON(
2224
2272
  { nodes: json.blocks, edges: json.edges ?? [] },
2225
2273
  {
2226
2274
  parent: node,
2227
- isClone
2275
+ onNodeCreated,
2276
+ onEdgeCreated
2228
2277
  }
2229
2278
  );
2230
2279
  }
@@ -2356,7 +2405,7 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2356
2405
  throw new Error(`[WorkflowDocument.createWorkflowNodeByType] Node Id "${id}" duplicated.`);
2357
2406
  }
2358
2407
  }
2359
- return this.createWorkflowNode(
2408
+ return this._createWorkflowNode(
2360
2409
  {
2361
2410
  ...json,
2362
2411
  id,
@@ -2367,13 +2416,15 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2367
2416
  blocks: json?.blocks,
2368
2417
  edges: json?.edges
2369
2418
  },
2370
- false,
2371
- parentID
2419
+ { parentID }
2372
2420
  );
2373
2421
  }
2374
2422
  getAllNodes() {
2375
2423
  return this.entityManager.getEntities(WorkflowNodeEntity).filter((n) => n.id !== import_document8.FlowNodeBaseType.ROOT);
2376
2424
  }
2425
+ getAllEdges() {
2426
+ return this.entityManager.getEntities(WorkflowLineEntity);
2427
+ }
2377
2428
  getAllPorts() {
2378
2429
  return this.entityManager.getEntities(WorkflowPortEntity).filter((p) => p.node.id !== import_document8.FlowNodeBaseType.ROOT);
2379
2430
  }
@@ -2474,7 +2525,7 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2474
2525
  x: json.meta.position.x + 30,
2475
2526
  y: json.meta.position.y + 30
2476
2527
  };
2477
- return this.createWorkflowNode(
2528
+ return this._createWorkflowNode(
2478
2529
  {
2479
2530
  id: newNodeId || `1${nanoid2()}`,
2480
2531
  type: node.flowNodeType,
@@ -2486,16 +2537,17 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2486
2537
  blocks: json.blocks,
2487
2538
  edges: json.edges
2488
2539
  },
2489
- true,
2490
- node.parent?.id
2540
+ {
2541
+ parentID: node.parent?.id
2542
+ }
2491
2543
  );
2492
2544
  }
2493
- copyNodeFromJSON(flowNodeType, nodeJSON, newNodeId, position, parentId) {
2545
+ copyNodeFromJSON(flowNodeType, nodeJSON, newNodeId, position, parentID) {
2494
2546
  position = position || {
2495
2547
  x: nodeJSON.meta.position.x + 30,
2496
2548
  y: nodeJSON.meta.position.y + 30
2497
2549
  };
2498
- return this.createWorkflowNode(
2550
+ return this._createWorkflowNode(
2499
2551
  {
2500
2552
  id: newNodeId || `1${nanoid2()}`,
2501
2553
  type: flowNodeType,
@@ -2507,8 +2559,9 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2507
2559
  blocks: nodeJSON.blocks,
2508
2560
  edges: nodeJSON.edges
2509
2561
  },
2510
- true,
2511
- parentId
2562
+ {
2563
+ parentID
2564
+ }
2512
2565
  );
2513
2566
  }
2514
2567
  canRemove(node, silent) {
@@ -2563,13 +2616,19 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2563
2616
  * 批量添加节点
2564
2617
  */
2565
2618
  batchAddFromJSON(json, options) {
2566
- const { parent = this.root, isClone = false } = options ?? {};
2567
- const containerID = this.getNodeSubCanvas(parent)?.canvasNode.id ?? parent.id;
2619
+ const { parent = this.root, onNodeCreated, onEdgeCreated } = options ?? {};
2620
+ const parentID = this.getNodeSubCanvas(parent)?.canvasNode.id ?? parent.id;
2568
2621
  const processedJSON = buildGroupJSON(json);
2569
2622
  const nodes = processedJSON.nodes.map(
2570
- (nodeJSON) => this.createWorkflowNode(nodeJSON, isClone, containerID)
2623
+ (nodeJSON) => this._createWorkflowNode(nodeJSON, {
2624
+ parentID,
2625
+ onNodeCreated,
2626
+ onEdgeCreated
2627
+ })
2571
2628
  );
2572
- const edges = processedJSON.edges.map((edge) => this.createWorkflowLine(edge, containerID)).filter(Boolean);
2629
+ const edges = processedJSON.edges.map((edge) => this.createWorkflowLine(edge, parentID)).filter(Boolean);
2630
+ nodes.forEach((node) => options?.onNodeCreated?.(node));
2631
+ edges.forEach((edge) => options?.onEdgeCreated?.(edge));
2573
2632
  return { nodes, edges };
2574
2633
  }
2575
2634
  getNodeSubCanvas(node) {
@@ -2618,7 +2677,7 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2618
2677
  }
2619
2678
  return lineJSON;
2620
2679
  }
2621
- createWorkflowLine(json, parentId) {
2680
+ createWorkflowLine(json, parentID) {
2622
2681
  const fromNode = this.getNode(json.sourceNodeID);
2623
2682
  const toNode = this.getNode(json.targetNodeID);
2624
2683
  if (!fromNode || !toNode) {
@@ -2631,10 +2690,10 @@ var WorkflowDocument = class extends import_document8.FlowDocument {
2631
2690
  toPort: json.targetPortID,
2632
2691
  data: json.data
2633
2692
  };
2634
- if (!parentId) {
2693
+ if (!parentID) {
2635
2694
  return this.linesManager.createLine(lineInfo);
2636
2695
  }
2637
- const canvasNode = this.getNode(parentId);
2696
+ const canvasNode = this.getNode(parentID);
2638
2697
  if (!canvasNode) {
2639
2698
  return this.linesManager.createLine(lineInfo);
2640
2699
  }
@@ -3097,20 +3156,16 @@ var WorkflowDragService = class {
3097
3156
  })
3098
3157
  );
3099
3158
  const containerTransform = container.getData(import_core15.TransformData);
3100
- containerTransform.update({
3101
- position: {
3102
- x: containerTransform.position.x + bounds.x,
3103
- y: containerTransform.position.y + bounds.y
3104
- }
3159
+ this.operationService.updateNodePosition(container, {
3160
+ x: containerTransform.position.x + bounds.x,
3161
+ y: containerTransform.position.y + bounds.y
3105
3162
  });
3106
3163
  this.document.layout.updateAffectedTransform(container);
3107
3164
  container.blocks.forEach((node) => {
3108
3165
  const transform = node.getData(import_core15.TransformData);
3109
- transform.update({
3110
- position: {
3111
- x: transform.position.x - bounds.x,
3112
- y: transform.position.y - bounds.y
3113
- }
3166
+ this.operationService.updateNodePosition(node, {
3167
+ x: transform.position.x - bounds.x,
3168
+ y: transform.position.y - bounds.y
3114
3169
  });
3115
3170
  this.document.layout.updateAffectedTransform(node);
3116
3171
  });
@@ -3431,7 +3486,7 @@ __decorateClass([
3431
3486
  (0, import_inversify6.inject)(WorkflowSelectService)
3432
3487
  ], WorkflowDragService.prototype, "selectService", 2);
3433
3488
  __decorateClass([
3434
- (0, import_inversify6.inject)(import_document9.FlowOperationBaseService)
3489
+ (0, import_inversify6.inject)(WorkflowOperationBaseService)
3435
3490
  ], WorkflowDragService.prototype, "operationService", 2);
3436
3491
  __decorateClass([
3437
3492
  (0, import_inversify6.inject)(WorkflowDocumentOptions)
@@ -3579,10 +3634,64 @@ var WorkflowOperationBaseServiceImpl = class extends import_document12.FlowOpera
3579
3634
  newPosition: position
3580
3635
  });
3581
3636
  }
3637
+ fromJSON(json) {
3638
+ if (this.document.disposed) return;
3639
+ const workflowJSON = {
3640
+ nodes: json.nodes ?? [],
3641
+ edges: json.edges ?? []
3642
+ };
3643
+ const oldNodes = this.document.getAllNodes();
3644
+ const oldEdges = this.linesManager.getAllLines();
3645
+ const oldPositionMap = new Map(
3646
+ oldNodes.map((node) => [
3647
+ node.id,
3648
+ {
3649
+ x: node.transform.transform.position.x,
3650
+ y: node.transform.transform.position.y
3651
+ }
3652
+ ])
3653
+ );
3654
+ const newNodes = [];
3655
+ const newEdges = [];
3656
+ this.document.batchAddFromJSON(workflowJSON, {
3657
+ onNodeCreated: (node) => newNodes.push(node),
3658
+ onEdgeCreated: (edge) => newEdges.push(edge)
3659
+ });
3660
+ const newEdgeIDSet = new Set(newEdges.map((edge) => edge.id));
3661
+ oldEdges.forEach((edge) => {
3662
+ if (!newEdgeIDSet.has(edge.id)) {
3663
+ edge.dispose();
3664
+ return;
3665
+ }
3666
+ });
3667
+ const newNodeIDSet = new Set(newNodes.map((node) => node.id));
3668
+ oldNodes.forEach((node) => {
3669
+ if (!newNodeIDSet.has(node.id)) {
3670
+ node.dispose();
3671
+ return;
3672
+ }
3673
+ const oldPosition = oldPositionMap.get(node.id);
3674
+ const newPosition = {
3675
+ x: node.transform.transform.position.x,
3676
+ y: node.transform.transform.position.y
3677
+ };
3678
+ if (oldPosition && (oldPosition.x !== newPosition.x || oldPosition.y !== newPosition.y)) {
3679
+ this.onNodePostionUpdateEmitter.fire({
3680
+ node,
3681
+ oldPosition,
3682
+ newPosition
3683
+ });
3684
+ }
3685
+ });
3686
+ this.document.fireRender();
3687
+ }
3582
3688
  };
3583
3689
  __decorateClass([
3584
3690
  (0, import_inversify8.inject)(WorkflowDocument)
3585
3691
  ], WorkflowOperationBaseServiceImpl.prototype, "document", 2);
3692
+ __decorateClass([
3693
+ (0, import_inversify8.inject)(WorkflowLinesManager)
3694
+ ], WorkflowOperationBaseServiceImpl.prototype, "linesManager", 2);
3586
3695
 
3587
3696
  // src/hooks/use-playground-readonly-state.ts
3588
3697
  var import_react = require("react");
@@ -3680,8 +3789,8 @@ function useNodeRender(nodeFromProps) {
3680
3789
  }, []);
3681
3790
  const getExtInfo = (0, import_react2.useCallback)(() => node.getExtInfo(), [node]);
3682
3791
  const updateExtInfo = (0, import_react2.useCallback)(
3683
- (data) => {
3684
- node.updateExtInfo(data);
3792
+ (data, fullUpdate) => {
3793
+ node.updateExtInfo(data, fullUpdate);
3685
3794
  },
3686
3795
  [node]
3687
3796
  );
@@ -3716,7 +3825,7 @@ function useNodeRender(nodeFromProps) {
3716
3825
  if (form) {
3717
3826
  form.updateFormValues(values);
3718
3827
  } else {
3719
- updateExtInfo(values);
3828
+ updateExtInfo(values, true);
3720
3829
  }
3721
3830
  },
3722
3831
  node,