@foblex/flow 16.0.3 → 16.0.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.
Files changed (21) hide show
  1. package/README.md +23 -18
  2. package/domain/providers.d.ts +1 -1
  3. package/esm2022/f-canvas/f-canvas.component.mjs +12 -5
  4. package/esm2022/f-connection/common/f-connection-text/f-connection-text-path.directive.mjs +2 -2
  5. package/esm2022/f-draggable/connections/reassign-connection/f-reassign-connection.event.mjs +3 -2
  6. package/esm2022/f-draggable/connections/reassign-connection/reassign-connection-finalize/reassign-connection-finalize.execution.mjs +3 -3
  7. package/esm2022/f-draggable/node/connection-base-drag-handler.mjs +14 -3
  8. package/esm2022/f-draggable/node/create-move-nodes-drag-model-from-selection/create-move-nodes-drag-model-from-selection.execution.mjs +8 -4
  9. package/esm2022/f-draggable/node/create-move-nodes-drag-model-from-selection/create-move-nodes-drag-model-from-selection.request.mjs +4 -1
  10. package/esm2022/f-draggable/node/node-move-preparation/node-move-preparation.execution.mjs +17 -7
  11. package/esm2022/f-draggable/single-select/single-select.execution.mjs +4 -1
  12. package/esm2022/f-zoom/f-zoom-base.mjs +37 -37
  13. package/f-canvas/f-canvas.component.d.ts +1 -0
  14. package/f-connection/providers.d.ts +1 -1
  15. package/f-connectors/providers.d.ts +1 -1
  16. package/f-draggable/connections/reassign-connection/f-reassign-connection.event.d.ts +3 -1
  17. package/f-draggable/node/connection-base-drag-handler.d.ts +1 -0
  18. package/f-draggable/node/create-move-nodes-drag-model-from-selection/create-move-nodes-drag-model-from-selection.request.d.ts +3 -0
  19. package/fesm2022/foblex-flow.mjs +94 -55
  20. package/fesm2022/foblex-flow.mjs.map +1 -1
  21. package/package.json +2 -2
@@ -14,6 +14,38 @@ export class FZoomBase {
14
14
  this.fComponentsStore = fComponentsStore;
15
15
  this.isEnabled = false;
16
16
  this.listeners = EventExtensions.emptyListener();
17
+ this.onWheel = (event) => {
18
+ event.preventDefault();
19
+ const targetElement = event.target;
20
+ if (this.fComponentsStore.fDraggable?.isDragStarted || targetElement?.closest('[fLockedContext]')) {
21
+ return;
22
+ }
23
+ let result = this.getScale();
24
+ const direction = event.deltaY > 0 ? -1 : 1;
25
+ const step = this.step;
26
+ result = result + step * direction;
27
+ result = Math.max(this.minimum, Math.min(result, this.maximum));
28
+ const pointerPositionInFlow = new Point(event.clientX, event.clientY).elementTransform(this.flowHost);
29
+ this.fCanvas.setZoom(result, pointerPositionInFlow);
30
+ this.fCanvas.redraw();
31
+ this.fCanvas.emitCanvasChangeEvent();
32
+ };
33
+ this.onDoubleClick = (event) => {
34
+ event.preventDefault();
35
+ const targetElement = event.target;
36
+ if (this.fComponentsStore.fDraggable?.isDragStarted || isNode(targetElement) || targetElement?.closest('[fLockedContext]')) {
37
+ return;
38
+ }
39
+ let result = this.getScale();
40
+ const direction = 1;
41
+ const step = this.dblClickStep;
42
+ result = result + step * direction;
43
+ result = Math.max(this.minimum, Math.min(result, this.maximum));
44
+ const pointerPositionInFlow = new Point(event.clientX, event.clientY).elementTransform(this.flowHost);
45
+ this.fCanvas.setZoom(result, pointerPositionInFlow);
46
+ this.fCanvas.redrawWithAnimation();
47
+ this.fCanvas.emitCanvasChangeEvent();
48
+ };
17
49
  }
18
50
  toggleZoom() {
19
51
  if (this.isEnabled) {
@@ -28,48 +60,16 @@ export class FZoomBase {
28
60
  if (!this.flowHost) {
29
61
  return;
30
62
  }
31
- this.flowHost.addEventListener('wheel', this.onWheel.bind(this));
32
- this.flowHost.addEventListener('dblclick', this.onDoubleClick.bind(this));
63
+ this.flowHost.addEventListener('wheel', this.onWheel);
64
+ this.flowHost.addEventListener('dblclick', this.onDoubleClick);
33
65
  this.listeners = () => {
34
- this.flowHost.removeEventListener('wheel', this.onWheel.bind(this));
35
- this.flowHost.removeEventListener('dblclick', this.onDoubleClick.bind(this));
66
+ this.flowHost.removeEventListener('wheel', this.onWheel);
67
+ this.flowHost.removeEventListener('dblclick', this.onDoubleClick);
36
68
  };
37
69
  }
38
70
  getScale() {
39
71
  return this.fCanvas.transform.scale || 1;
40
72
  }
41
- onWheel(event) {
42
- event.preventDefault();
43
- const targetElement = event.target;
44
- if (this.fComponentsStore.fDraggable?.isDragStarted || targetElement?.closest('[fLockedContext]')) {
45
- return;
46
- }
47
- let result = this.getScale();
48
- const direction = event.deltaY > 0 ? -1 : 1;
49
- const step = this.step;
50
- result = result + step * direction;
51
- result = Math.max(this.minimum, Math.min(result, this.maximum));
52
- const pointerPositionInFlow = new Point(event.clientX, event.clientY).elementTransform(this.flowHost);
53
- this.fCanvas.setZoom(result, pointerPositionInFlow);
54
- this.fCanvas.redraw();
55
- this.fCanvas.emitCanvasChangeEvent();
56
- }
57
- onDoubleClick(event) {
58
- event.preventDefault();
59
- const targetElement = event.target;
60
- if (this.fComponentsStore.fDraggable?.isDragStarted || isNode(targetElement) || targetElement?.closest('[fLockedContext]')) {
61
- return;
62
- }
63
- let result = this.getScale();
64
- const direction = 1;
65
- const step = this.dblClickStep;
66
- result = result + step * direction;
67
- result = Math.max(this.minimum, Math.min(result, this.maximum));
68
- const pointerPositionInFlow = new Point(event.clientX, event.clientY).elementTransform(this.flowHost);
69
- this.fCanvas.setZoom(result, pointerPositionInFlow);
70
- this.fCanvas.redrawWithAnimation();
71
- this.fCanvas.emitCanvasChangeEvent();
72
- }
73
73
  onZoomToCenter(deltaY, position) {
74
74
  const preventDefault = () => {
75
75
  };
@@ -94,4 +94,4 @@ export class FZoomBase {
94
94
  this.listeners = EventExtensions.emptyListener();
95
95
  }
96
96
  }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi16b29tLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2Ytem9vbS9mLXpvb20tYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFVLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsQ0FBWSxRQUFRLENBQUMsQ0FBQztBQUU5RCxNQUFNLE9BQWdCLFNBQVM7SUFZN0IsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQXNCLENBQUM7SUFDdEQsQ0FBQztJQUVELFlBQ2MsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFuQnRDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFRN0IsY0FBUyxHQUFhLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQWE5RCxDQUFDO0lBRVMsVUFBVTtRQUNsQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2xCO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFFRCxJQUFJ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QUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVTLFdBQVc7UUFDbkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ25ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RXh0ZW5zaW9ucyB9IGZyb20gJ0Bmb2JsZXgvZHJhZy10b29sa2l0JztcbmltcG9ydCB7IElQb2ludCwgUG9pbnQsIFJlY3RFeHRlbnNpb25zIH0gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRkNhbnZhc0Jhc2UgfSBmcm9tICcuLi9mLWNhbnZhcyc7XG5pbXBvcnQgeyBGQ29tcG9uZW50c1N0b3JlIH0gZnJvbSAnLi4vZi1zdG9yYWdlJztcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL2Ytbm9kZSc7XG5cbmV4cG9ydCBjb25zdCBGX1pPT00gPSBuZXcgSW5qZWN0aW9uVG9rZW48Rlpvb21CYXNlPignRl9aT09NJyk7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGWm9vbUJhc2Uge1xuXG4gIHByb3RlY3RlZCBpc0VuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgYWJzdHJhY3QgbWluaW11bTogbnVtYmVyO1xuICBwdWJsaWMgYWJzdHJhY3QgbWF4aW11bTogbnVtYmVyO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBzdGVwOiBudW1iZXI7XG4gIHB1YmxpYyBhYnN0cmFjdCBkYmxDbGlja1N0ZXA6IG51bWJlcjtcblxuICBwcml2YXRlIGxpc3RlbmVyczogRnVuY3Rpb24gPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuXG4gIHByaXZhdGUgZ2V0IGZsb3dIb3N0KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5mQ29tcG9uZW50c1N0b3JlLmZsb3dIb3N0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZkNhbnZhcygpOiBGQ2FudmFzQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZkNvbXBvbmVudHNTdG9yZS5mQ2FudmFzIGFzIEZDYW52YXNCYXNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIGZDb21wb25lbnRzU3RvcmU6IEZDb21wb25lbnRzU3RvcmVcbiAgKSB7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlWm9vbSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVycygpO1xuICAgIGlmICghdGhpcy5mbG93SG9zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxvd0hvc3QuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uV2hlZWwuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5mbG93SG9zdC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMub25Eb3VibGVDbGljay5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmxpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgIHRoaXMuZmxvd0hvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uV2hlZWwuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLmZsb3dIb3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbkRvdWJsZUNsaWNrLmJpbmQodGhpcykpO1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0U2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5mQ2FudmFzLnRyYW5zZm9ybS5zY2FsZSB8fCAxO1xuICB9XG5cbiAgcHJpdmF0ZSBvbldoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKHRoaXMuZkNvbXBvbmVudHNTdG9yZS5mRHJhZ2dhYmxlPy5pc0RyYWdTdGFydGVkIHx8IHRhcmdldEVsZW1lbnQ/LmNsb3Nlc3QoJ1tmTG9ja2VkQ29udGV4dF0nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IHRoaXMuZ2V0U2NhbGUoKTtcblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50LmRlbHRhWSA+IDAgPyAtMSA6IDE7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcDtcbiAgICByZXN1bHQgPSByZXN1bHQgKyBzdGVwICogZGlyZWN0aW9uO1xuXG4gICAgcmVzdWx0ID0gTWF0aC5tYXgodGhpcy5taW5pbXVtLCBNYXRoLm1pbihyZXN1bHQsIHRoaXMubWF4aW11bSkpO1xuXG4gICAgY29uc3QgcG9pbnRlclBvc2l0aW9uSW5GbG93ID0gbmV3IFBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpLmVsZW1lbnRUcmFuc2Zvcm0odGhpcy5mbG93SG9zdCk7XG5cbiAgICB0aGlzLmZDYW52YXMuc2V0Wm9vbShyZXN1bHQsIHBvaW50ZXJQb3NpdGlvbkluRmxvdyk7XG4gICAgdGhpcy5mQ2FudmFzLnJlZHJhdygpO1xuICAgIHRoaXMuZkNhbnZhcy5lbWl0Q2FudmFzQ2hhbmdlRXZlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Eb3VibGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0aGlzLmZDb21wb25lbnRzU3RvcmUuZkRyYWdnYWJsZT8uaXNEcmFnU3RhcnRlZCB8fCBpc05vZGUodGFyZ2V0RWxlbWVudCkgfHwgdGFyZ2V0RWxlbWVudD8uY2xvc2VzdCgnW2ZMb2NrZWRDb250ZXh0XScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gdGhpcy5nZXRTY2FsZSgpO1xuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gMTtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5kYmxDbGlja1N0ZXA7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RlcCAqIGRpcmVjdGlvbjtcblxuICAgIHJlc3VsdCA9IE1hdGgubWF4KHRoaXMubWluaW11bSwgTWF0aC5taW4ocmVzdWx0LCB0aGlzLm1heGltdW0pKTtcblxuICAgIGNvbnN0IHBvaW50ZXJQb3NpdGlvbkluRmxvdyA9IG5ldyBQb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKS5lbGVtZW50VHJhbnNmb3JtKHRoaXMuZmxvd0hvc3QpO1xuICAgIHRoaXMuZkNhbnZhcy5zZXRab29tKHJlc3VsdCwgcG9pbnRlclBvc2l0aW9uSW5GbG93KTtcbiAgICB0aGlzLmZDYW52YXMucmVkcmF3V2l0aEFuaW1hdGlvbigpO1xuICAgIHRoaXMuZkNhbnZhcy5lbWl0Q2FudmFzQ2hhbmdlRXZlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25ab29tVG9DZW50ZXIoZGVsdGFZOiBudW1iZXIsIHBvc2l0aW9uPzogSVBvaW50KTogdm9pZCB7XG4gICAgY29uc3QgcHJldmVudERlZmF1bHQgPSAoKSA9PiB7XG4gICAgfTtcbiAgICBjb25zdCByZWN0ID0gUmVjdEV4dGVuc2lvbnMuZnJvbUVsZW1lbnQodGhpcy5mbG93SG9zdCk7XG5cbiAgICB0aGlzLm9uV2hlZWwoe1xuICAgICAgZGVsdGFZLCBwcmV2ZW50RGVmYXVsdCwgY2xpZW50WDogcG9zaXRpb24/LnggfHwgcmVjdC5ncmF2aXR5Q2VudGVyLngsIGNsaWVudFk6IHBvc2l0aW9uPy55IHx8IHJlY3QuZ3Jhdml0eUNlbnRlci55XG4gICAgfSBhcyBXaGVlbEV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tSW4ocG9zaXRpb24/OiBJUG9pbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uWm9vbVRvQ2VudGVyKC0xLCBwb3NpdGlvbik7XG4gIH1cblxuICBwdWJsaWMgem9vbU91dChwb3NpdGlvbj86IElQb2ludCk6IHZvaWQge1xuICAgIHRoaXMub25ab29tVG9DZW50ZXIoMSwgcG9zaXRpb24pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZkNhbnZhcy5yZXNldFpvb20oKTtcbiAgICB0aGlzLmZDYW52YXMucmVkcmF3KCk7XG4gICAgdGhpcy5mQ2FudmFzLmVtaXRDYW52YXNDaGFuZ2VFdmVudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXJzKCk7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuICB9XG59XG4iXX0=
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi16b29tLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2Ytem9vbS9mLXpvb20tYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFVLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsQ0FBWSxRQUFRLENBQUMsQ0FBQztBQUU5RCxNQUFNLE9BQWdCLFNBQVM7SUFZN0IsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQXNCLENBQUM7SUFDdEQsQ0FBQztJQUVELFlBQ2MsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFuQnRDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFRN0IsY0FBUyxHQUFhLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQXlDdEQsWUFBTyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO1lBQ3RDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztZQUVsRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxJQUFJLGFBQWEsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFBRTtnQkFDakcsT0FBTzthQUNSO1lBRUQsSUFBSSxNQUFNLEdBQVcsSUFB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LHFCQUFxQixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVTLFdBQVc7UUFDbkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ25ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RXh0ZW5zaW9ucyB9IGZyb20gJ0Bmb2JsZXgvZHJhZy10b29sa2l0JztcbmltcG9ydCB7IElQb2ludCwgUG9pbnQsIFJlY3RFeHRlbnNpb25zIH0gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRkNhbnZhc0Jhc2UgfSBmcm9tICcuLi9mLWNhbnZhcyc7XG5pbXBvcnQgeyBGQ29tcG9uZW50c1N0b3JlIH0gZnJvbSAnLi4vZi1zdG9yYWdlJztcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL2Ytbm9kZSc7XG5cbmV4cG9ydCBjb25zdCBGX1pPT00gPSBuZXcgSW5qZWN0aW9uVG9rZW48Rlpvb21CYXNlPignRl9aT09NJyk7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGWm9vbUJhc2Uge1xuXG4gIHByb3RlY3RlZCBpc0VuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgYWJzdHJhY3QgbWluaW11bTogbnVtYmVyO1xuICBwdWJsaWMgYWJzdHJhY3QgbWF4aW11bTogbnVtYmVyO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBzdGVwOiBudW1iZXI7XG4gIHB1YmxpYyBhYnN0cmFjdCBkYmxDbGlja1N0ZXA6IG51bWJlcjtcblxuICBwcml2YXRlIGxpc3RlbmVyczogRnVuY3Rpb24gPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuXG4gIHByaXZhdGUgZ2V0IGZsb3dIb3N0KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5mQ29tcG9uZW50c1N0b3JlLmZsb3dIb3N0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZkNhbnZhcygpOiBGQ2FudmFzQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZkNvbXBvbmVudHNTdG9yZS5mQ2FudmFzIGFzIEZDYW52YXNCYXNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIGZDb21wb25lbnRzU3RvcmU6IEZDb21wb25lbnRzU3RvcmVcbiAgKSB7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlWm9vbSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVycygpO1xuICAgIGlmICghdGhpcy5mbG93SG9zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxvd0hvc3QuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uV2hlZWwpO1xuICAgIHRoaXMuZmxvd0hvc3QuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uRG91YmxlQ2xpY2spO1xuICAgIHRoaXMubGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgdGhpcy5mbG93SG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMub25XaGVlbCk7XG4gICAgICB0aGlzLmZsb3dIb3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbkRvdWJsZUNsaWNrKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldFNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZkNhbnZhcy50cmFuc2Zvcm0uc2NhbGUgfHwgMTtcbiAgfVxuXG4gIHByaXZhdGUgb25XaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0aGlzLmZDb21wb25lbnRzU3RvcmUuZkRyYWdnYWJsZT8uaXNEcmFnU3RhcnRlZCB8fCB0YXJnZXRFbGVtZW50Py5jbG9zZXN0KCdbZkxvY2tlZENvbnRleHRdJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSB0aGlzLmdldFNjYWxlKCk7XG5cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBldmVudC5kZWx0YVkgPiAwID8gLTEgOiAxO1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXA7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RlcCAqIGRpcmVjdGlvbjtcblxuICAgIHJlc3VsdCA9IE1hdGgubWF4KHRoaXMubWluaW11bSwgTWF0aC5taW4ocmVzdWx0LCB0aGlzLm1heGltdW0pKTtcblxuICAgIGNvbnN0IHBvaW50ZXJQb3NpdGlvbkluRmxvdyA9IG5ldyBQb2ludChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKS5lbGVtZW50VHJhbnNmb3JtKHRoaXMuZmxvd0hvc3QpO1xuXG4gICAgdGhpcy5mQ2FudmFzLnNldFpvb20ocmVzdWx0LCBwb2ludGVyUG9zaXRpb25JbkZsb3cpO1xuICAgIHRoaXMuZkNhbnZhcy5yZWRyYXcoKTtcbiAgICB0aGlzLmZDYW52YXMuZW1pdENhbnZhc0NoYW5nZUV2ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIG9uRG91YmxlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5mQ29tcG9uZW50c1N0b3JlLmZEcmFnZ2FibGU/LmlzRHJhZ1N0YXJ0ZWQgfHwgaXNOb2RlKHRhcmdldEVsZW1lbnQpIHx8IHRhcmdldEVsZW1lbnQ/LmNsb3Nlc3QoJ1tmTG9ja2VkQ29udGV4dF0nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IHRoaXMuZ2V0U2NhbGUoKTtcblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IDE7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuZGJsQ2xpY2tTdGVwO1xuICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZXAgKiBkaXJlY3Rpb247XG5cbiAgICByZXN1bHQgPSBNYXRoLm1heCh0aGlzLm1pbmltdW0sIE1hdGgubWluKHJlc3VsdCwgdGhpcy5tYXhpbXVtKSk7XG5cbiAgICBjb25zdCBwb2ludGVyUG9zaXRpb25JbkZsb3cgPSBuZXcgUG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkuZWxlbWVudFRyYW5zZm9ybSh0aGlzLmZsb3dIb3N0KTtcbiAgICB0aGlzLmZDYW52YXMuc2V0Wm9vbShyZXN1bHQsIHBvaW50ZXJQb3NpdGlvbkluRmxvdyk7XG4gICAgdGhpcy5mQ2FudmFzLnJlZHJhd1dpdGhBbmltYXRpb24oKTtcbiAgICB0aGlzLmZDYW52YXMuZW1pdENhbnZhc0NoYW5nZUV2ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIG9uWm9vbVRvQ2VudGVyKGRlbHRhWTogbnVtYmVyLCBwb3NpdGlvbj86IElQb2ludCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZlbnREZWZhdWx0ID0gKCkgPT4ge1xuICAgIH07XG4gICAgY29uc3QgcmVjdCA9IFJlY3RFeHRlbnNpb25zLmZyb21FbGVtZW50KHRoaXMuZmxvd0hvc3QpO1xuXG4gICAgdGhpcy5vbldoZWVsKHtcbiAgICAgIGRlbHRhWSwgcHJldmVudERlZmF1bHQsIGNsaWVudFg6IHBvc2l0aW9uPy54IHx8IHJlY3QuZ3Jhdml0eUNlbnRlci54LCBjbGllbnRZOiBwb3NpdGlvbj8ueSB8fCByZWN0LmdyYXZpdHlDZW50ZXIueVxuICAgIH0gYXMgV2hlZWxFdmVudCk7XG4gIH1cblxuICBwdWJsaWMgem9vbUluKHBvc2l0aW9uPzogSVBvaW50KTogdm9pZCB7XG4gICAgdGhpcy5vblpvb21Ub0NlbnRlcigtMSwgcG9zaXRpb24pO1xuICB9XG5cbiAgcHVibGljIHpvb21PdXQocG9zaXRpb24/OiBJUG9pbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uWm9vbVRvQ2VudGVyKDEsIHBvc2l0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmZDYW52YXMucmVzZXRab29tKCk7XG4gICAgdGhpcy5mQ2FudmFzLnJlZHJhdygpO1xuICAgIHRoaXMuZkNhbnZhcy5lbWl0Q2FudmFzQ2hhbmdlRXZlbnQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVycygpO1xuICAgIHRoaXMubGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgfVxufVxuIl19
@@ -22,6 +22,7 @@ export declare class FCanvasComponent extends FCanvasBase implements OnInit {
22
22
  ngOnInit(): void;
23
23
  redraw(): void;
24
24
  redrawWithAnimation(): void;
25
+ private isMobile;
25
26
  centerGroupOrNode(id: string, animated?: boolean): void;
26
27
  fitToScreen(toCenter?: IPoint, animated?: boolean): void;
27
28
  resetScaleAndCenter(animated?: boolean): void;
@@ -4,4 +4,4 @@ import { FConnectionCenterDirective } from './f-connection-center';
4
4
  import { FConnectionForCreateComponent } from './f-connection-for-create';
5
5
  import { FMarkerDirective } from './f-marker';
6
6
  import { FSnapConnectionComponent } from './f-snap-connection';
7
- export declare const F_CONNECTION_PROVIDERS: (typeof FConnectionComponent | typeof FConnectionDragHandleComponent | typeof FConnectionSelectionComponent | typeof FConnectionCenterDirective | typeof FConnectionTextPathDirective | typeof FConnectionTextComponent | typeof FConnectionGradientComponent | typeof FConnectionPathComponent | typeof FMarkerDirective | typeof FConnectionForCreateComponent | typeof FSnapConnectionComponent)[];
7
+ export declare const F_CONNECTION_PROVIDERS: (typeof FConnectionTextPathDirective | typeof FConnectionTextComponent | typeof FConnectionDragHandleComponent | typeof FConnectionGradientComponent | typeof FConnectionPathComponent | typeof FConnectionSelectionComponent | typeof FMarkerDirective | typeof FConnectionCenterDirective | typeof FConnectionForCreateComponent | typeof FConnectionComponent | typeof FSnapConnectionComponent)[];
@@ -1,4 +1,4 @@
1
1
  import { FNodeInputDirective } from './f-node-input';
2
2
  import { FNodeOutletDirective } from './f-node-outlet';
3
3
  import { FNodeOutputDirective } from './f-node-output';
4
- export declare const F_CONNECTORS_PROVIDERS: (typeof FNodeOutputDirective | typeof FNodeOutletDirective | typeof FNodeInputDirective)[];
4
+ export declare const F_CONNECTORS_PROVIDERS: (typeof FNodeInputDirective | typeof FNodeOutletDirective | typeof FNodeOutputDirective)[];
@@ -1,7 +1,9 @@
1
+ import { IPoint } from '@foblex/2d';
1
2
  export declare class FReassignConnectionEvent {
2
3
  fConnectionId: string;
3
4
  fOutputId: string;
4
5
  oldFInputId: string;
5
6
  newFInputId: string | undefined;
6
- constructor(fConnectionId: string, fOutputId: string, oldFInputId: string, newFInputId: string | undefined);
7
+ fDropPosition: IPoint;
8
+ constructor(fConnectionId: string, fOutputId: string, oldFInputId: string, newFInputId: string | undefined, fDropPosition: IPoint);
7
9
  }
@@ -16,6 +16,7 @@ export declare abstract class ConnectionBaseDragHandler implements IDraggableIte
16
16
  initialize(): void;
17
17
  private getOutput;
18
18
  private getInput;
19
+ private connectorNotFoundPrefix;
19
20
  abstract move(difference: IPoint): void;
20
21
  protected getDifference(difference: IPoint, restrictions: INodeMoveRestrictions): IPoint;
21
22
  protected redrawConnection(line: ILine): void;
@@ -1,2 +1,5 @@
1
+ import { FNodeBase } from '../../../f-node';
1
2
  export declare class CreateMoveNodesDragModelFromSelectionRequest {
3
+ nodeWithDisabledSelection?: FNodeBase | undefined;
4
+ constructor(nodeWithDisabledSelection?: FNodeBase | undefined);
2
5
  }
@@ -2275,11 +2275,12 @@ class ReassignConnectionFinalizeRequest {
2275
2275
  }
2276
2276
 
2277
2277
  class FReassignConnectionEvent {
2278
- constructor(fConnectionId, fOutputId, oldFInputId, newFInputId) {
2278
+ constructor(fConnectionId, fOutputId, oldFInputId, newFInputId, fDropPosition) {
2279
2279
  this.fConnectionId = fConnectionId;
2280
2280
  this.fOutputId = fOutputId;
2281
2281
  this.oldFInputId = oldFInputId;
2282
2282
  this.newFInputId = newFInputId;
2283
+ this.fDropPosition = fDropPosition;
2283
2284
  }
2284
2285
  }
2285
2286
 
@@ -2301,10 +2302,10 @@ let ReassignConnectionFinalizeExecution = class ReassignConnectionFinalizeExecut
2301
2302
  }
2302
2303
  emitEvent(event) {
2303
2304
  const input = this.getInputUnderPointer(event);
2304
- if (!input || !this.isReassignToDifferentInput(input)) {
2305
+ if (!!input && !this.isReassignToDifferentInput(input)) {
2305
2306
  return;
2306
2307
  }
2307
- this.fDraggable.fReassignConnection.emit(new FReassignConnectionEvent(this.dragHandler.fConnection.fId, this.dragHandler.fConnection.fOutputId, this.dragHandler.fConnection.fInputId, input.id));
2308
+ this.fDraggable.fReassignConnection.emit(new FReassignConnectionEvent(this.dragHandler.fConnection.fId, this.dragHandler.fConnection.fOutputId, this.dragHandler.fConnection.fInputId, input?.id, event.getPosition()));
2308
2309
  }
2309
2310
  getInputUnderPointer(event) {
2310
2311
  return this.fMediator.send(new GetInputUnderPointerRequest(event, this.dragHandler));
@@ -2705,7 +2706,7 @@ class FConnectionTextPathDirective {
2705
2706
  getSymbolWidth(name) {
2706
2707
  const text = name || 'connection';
2707
2708
  const { fontFamily, fontSize } = this.getFontStyles(this.hostElement);
2708
- this.fontSize = fontSize;
2709
+ this.fontSize = fontSize || '12px';
2709
2710
  const canvas = this.fBrowser.document.createElement('canvas');
2710
2711
  let context;
2711
2712
  try {
@@ -3883,10 +3884,21 @@ class ConnectionBaseDragHandler {
3883
3884
  this.fInputWithRect = this.fMediator.send(new GetConnectorWithRectRequest(this.getInput()));
3884
3885
  }
3885
3886
  getOutput() {
3886
- return this.fComponentsStore.fOutputs.find((x) => x.id === this.connection.fOutputId);
3887
+ const result = this.fComponentsStore.fOutputs.find((x) => x.id === this.connection.fOutputId);
3888
+ if (!result) {
3889
+ throw new Error(this.connectorNotFoundPrefix(`fOutput with id ${this.connection.fOutputId} not found`));
3890
+ }
3891
+ return result;
3887
3892
  }
3888
3893
  getInput() {
3889
- return this.fComponentsStore.fInputs.find((x) => x.id === this.connection.fInputId);
3894
+ const result = this.fComponentsStore.fInputs.find((x) => x.id === this.connection.fInputId);
3895
+ if (!result) {
3896
+ throw new Error(this.connectorNotFoundPrefix(`fInput with id ${this.connection.fInputId} not found`));
3897
+ }
3898
+ return result;
3899
+ }
3900
+ connectorNotFoundPrefix(message) {
3901
+ return `ConnectionDragHandler Error: Connection From (fOutput)${this.connection.fOutputId} To (fInput)${this.connection.fInputId}. ${message}. Please ensure that all f-connections are associated with existing connectors`;
3890
3902
  }
3891
3903
  getDifference(difference, restrictions) {
3892
3904
  return {
@@ -4122,6 +4134,9 @@ const DEFAULT_RESTRICTIONS = {
4122
4134
  };
4123
4135
 
4124
4136
  class CreateMoveNodesDragModelFromSelectionRequest {
4137
+ constructor(nodeWithDisabledSelection) {
4138
+ this.nodeWithDisabledSelection = nodeWithDisabledSelection;
4139
+ }
4125
4140
  }
4126
4141
 
4127
4142
  class NodeDragHandler {
@@ -4175,13 +4190,17 @@ let CreateMoveNodesDragModelFromSelectionExecution = class CreateMoveNodesDragMo
4175
4190
  this.fMediator = fMediator;
4176
4191
  }
4177
4192
  handle(request) {
4178
- const itemsToDrag = this.getNodesWithRestrictions(this.getSelectedNodes());
4193
+ const itemsToDrag = this.getNodesWithRestrictions(this.getSelectedNodes(request.nodeWithDisabledSelection));
4179
4194
  return this.getDragHandlersWithConnections(this.getDragHandlersFromNodes(itemsToDrag), this.getAllOutputIds(itemsToDrag), this.getAllInputIds(itemsToDrag));
4180
4195
  }
4181
- getSelectedNodes() {
4182
- return this.fDraggableDataContext.selectedItems
4196
+ getSelectedNodes(nodeWithDisabledSelection) {
4197
+ const result = this.fDraggableDataContext.selectedItems
4183
4198
  .map((x) => this.fComponentsStore.findNode(x.hostElement))
4184
4199
  .filter((x) => !!x);
4200
+ if (nodeWithDisabledSelection) {
4201
+ result.push(nodeWithDisabledSelection);
4202
+ }
4203
+ return result;
4185
4204
  }
4186
4205
  getNodesWithRestrictions(selectedNodes) {
4187
4206
  const result = [];
@@ -4262,22 +4281,32 @@ let NodeMovePreparationExecution = class NodeMovePreparationExecution {
4262
4281
  this.fMediator = fMediator;
4263
4282
  }
4264
4283
  handle(request) {
4265
- this.selectAndUpdateNodeLayer(request.event.targetElement);
4266
- const itemsToDrag = this.createDragModelFromSelection();
4284
+ const node = this.getNode(request.event.targetElement);
4285
+ if (!node) {
4286
+ throw new Error('Node not found');
4287
+ }
4288
+ let itemsToDrag = [];
4289
+ if (!node.fSelectionDisabled) {
4290
+ this.selectAndUpdateNodeLayer(node);
4291
+ itemsToDrag = this.createDragModelFromSelection();
4292
+ }
4293
+ else {
4294
+ itemsToDrag = this.createDragModelFromSelection(node);
4295
+ }
4267
4296
  this.initializeLineAlignment(this.filterNodesFromDraggableItems(itemsToDrag));
4268
4297
  this.fDraggableDataContext.onPointerDownScale = this.transform.scale;
4269
4298
  this.fDraggableDataContext.onPointerDownPosition = Point.fromPoint(request.event.getPosition())
4270
4299
  .elementTransform(this.flowHost).div(this.transform.scale);
4271
4300
  this.fDraggableDataContext.draggableItems = itemsToDrag;
4272
4301
  }
4273
- selectAndUpdateNodeLayer(targetElement) {
4274
- this.fMediator.send(new SelectAndUpdateNodeLayerRequest(this.getNode(targetElement)));
4302
+ selectAndUpdateNodeLayer(node) {
4303
+ this.fMediator.send(new SelectAndUpdateNodeLayerRequest(node));
4275
4304
  }
4276
4305
  getNode(targetElement) {
4277
4306
  return this.fComponentsStore.findNode(targetElement);
4278
4307
  }
4279
- createDragModelFromSelection() {
4280
- return this.fMediator.send(new CreateMoveNodesDragModelFromSelectionRequest());
4308
+ createDragModelFromSelection(nodeWithDisabledSelection) {
4309
+ return this.fMediator.send(new CreateMoveNodesDragModelFromSelectionRequest(nodeWithDisabledSelection));
4281
4310
  }
4282
4311
  initializeLineAlignment(nodesToDrag) {
4283
4312
  this.fDraggableDataContext.fLineAlignment?.initialize(this.fComponentsStore.fNodes, nodesToDrag);
@@ -4870,6 +4899,9 @@ let SingleSelectExecution = class SingleSelectExecution {
4870
4899
  this.clearSelection();
4871
4900
  this.selectItem(item);
4872
4901
  }
4902
+ else if (item.fSelectionDisabled) {
4903
+ this.clearSelection();
4904
+ }
4873
4905
  }
4874
4906
  else {
4875
4907
  this.clearSelection();
@@ -7102,11 +7134,18 @@ class FCanvasComponent extends FCanvasBase {
7102
7134
  this.fMediator.send(new EmitTransformChangesRequest());
7103
7135
  }
7104
7136
  redrawWithAnimation() {
7137
+ let duration = F_CANVAS_ANIMATION_DURATION;
7138
+ if (this.isMobile()) {
7139
+ duration = 80;
7140
+ }
7105
7141
  this.fComponentsStore.fBackground?.setTransform(this.transform);
7106
- this.hostElement.setAttribute("style", `transition: transform ${F_CANVAS_ANIMATION_DURATION}ms ease-in-out; transform: ${TransformModelExtensions.toString(this.transform)}`);
7107
- setTimeout(() => {
7108
- this.redraw();
7109
- }, F_CANVAS_ANIMATION_DURATION);
7142
+ this.hostElement.setAttribute("style", `transition: transform ${duration}ms ease-in-out; transform: ${TransformModelExtensions.toString(this.transform)}`);
7143
+ setTimeout(() => this.redraw(), F_CANVAS_ANIMATION_DURATION);
7144
+ }
7145
+ isMobile() {
7146
+ // @ts-ignore
7147
+ const userAgent = navigator.userAgent || navigator.vendor || window['opera'];
7148
+ return /android|iPad|iPhone|iPod/i.test(userAgent);
7110
7149
  }
7111
7150
  centerGroupOrNode(id, animated = true) {
7112
7151
  this.fMediator.send(new CenterGroupOrNodeRequest(id, animated));
@@ -7754,6 +7793,38 @@ class FZoomBase {
7754
7793
  this.fComponentsStore = fComponentsStore;
7755
7794
  this.isEnabled = false;
7756
7795
  this.listeners = EventExtensions.emptyListener();
7796
+ this.onWheel = (event) => {
7797
+ event.preventDefault();
7798
+ const targetElement = event.target;
7799
+ if (this.fComponentsStore.fDraggable?.isDragStarted || targetElement?.closest('[fLockedContext]')) {
7800
+ return;
7801
+ }
7802
+ let result = this.getScale();
7803
+ const direction = event.deltaY > 0 ? -1 : 1;
7804
+ const step = this.step;
7805
+ result = result + step * direction;
7806
+ result = Math.max(this.minimum, Math.min(result, this.maximum));
7807
+ const pointerPositionInFlow = new Point(event.clientX, event.clientY).elementTransform(this.flowHost);
7808
+ this.fCanvas.setZoom(result, pointerPositionInFlow);
7809
+ this.fCanvas.redraw();
7810
+ this.fCanvas.emitCanvasChangeEvent();
7811
+ };
7812
+ this.onDoubleClick = (event) => {
7813
+ event.preventDefault();
7814
+ const targetElement = event.target;
7815
+ if (this.fComponentsStore.fDraggable?.isDragStarted || isNode(targetElement) || targetElement?.closest('[fLockedContext]')) {
7816
+ return;
7817
+ }
7818
+ let result = this.getScale();
7819
+ const direction = 1;
7820
+ const step = this.dblClickStep;
7821
+ result = result + step * direction;
7822
+ result = Math.max(this.minimum, Math.min(result, this.maximum));
7823
+ const pointerPositionInFlow = new Point(event.clientX, event.clientY).elementTransform(this.flowHost);
7824
+ this.fCanvas.setZoom(result, pointerPositionInFlow);
7825
+ this.fCanvas.redrawWithAnimation();
7826
+ this.fCanvas.emitCanvasChangeEvent();
7827
+ };
7757
7828
  }
7758
7829
  toggleZoom() {
7759
7830
  if (this.isEnabled) {
@@ -7768,48 +7839,16 @@ class FZoomBase {
7768
7839
  if (!this.flowHost) {
7769
7840
  return;
7770
7841
  }
7771
- this.flowHost.addEventListener('wheel', this.onWheel.bind(this));
7772
- this.flowHost.addEventListener('dblclick', this.onDoubleClick.bind(this));
7842
+ this.flowHost.addEventListener('wheel', this.onWheel);
7843
+ this.flowHost.addEventListener('dblclick', this.onDoubleClick);
7773
7844
  this.listeners = () => {
7774
- this.flowHost.removeEventListener('wheel', this.onWheel.bind(this));
7775
- this.flowHost.removeEventListener('dblclick', this.onDoubleClick.bind(this));
7845
+ this.flowHost.removeEventListener('wheel', this.onWheel);
7846
+ this.flowHost.removeEventListener('dblclick', this.onDoubleClick);
7776
7847
  };
7777
7848
  }
7778
7849
  getScale() {
7779
7850
  return this.fCanvas.transform.scale || 1;
7780
7851
  }
7781
- onWheel(event) {
7782
- event.preventDefault();
7783
- const targetElement = event.target;
7784
- if (this.fComponentsStore.fDraggable?.isDragStarted || targetElement?.closest('[fLockedContext]')) {
7785
- return;
7786
- }
7787
- let result = this.getScale();
7788
- const direction = event.deltaY > 0 ? -1 : 1;
7789
- const step = this.step;
7790
- result = result + step * direction;
7791
- result = Math.max(this.minimum, Math.min(result, this.maximum));
7792
- const pointerPositionInFlow = new Point(event.clientX, event.clientY).elementTransform(this.flowHost);
7793
- this.fCanvas.setZoom(result, pointerPositionInFlow);
7794
- this.fCanvas.redraw();
7795
- this.fCanvas.emitCanvasChangeEvent();
7796
- }
7797
- onDoubleClick(event) {
7798
- event.preventDefault();
7799
- const targetElement = event.target;
7800
- if (this.fComponentsStore.fDraggable?.isDragStarted || isNode(targetElement) || targetElement?.closest('[fLockedContext]')) {
7801
- return;
7802
- }
7803
- let result = this.getScale();
7804
- const direction = 1;
7805
- const step = this.dblClickStep;
7806
- result = result + step * direction;
7807
- result = Math.max(this.minimum, Math.min(result, this.maximum));
7808
- const pointerPositionInFlow = new Point(event.clientX, event.clientY).elementTransform(this.flowHost);
7809
- this.fCanvas.setZoom(result, pointerPositionInFlow);
7810
- this.fCanvas.redrawWithAnimation();
7811
- this.fCanvas.emitCanvasChangeEvent();
7812
- }
7813
7852
  onZoomToCenter(deltaY, position) {
7814
7853
  const preventDefault = () => {
7815
7854
  };