ngx-vflow 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +22 -16
- package/esm2022/lib/vflow/directives/flow-size-controller.directive.mjs +36 -0
- package/esm2022/lib/vflow/directives/map-context.directive.mjs +16 -12
- package/esm2022/lib/vflow/interfaces/box.mjs +2 -0
- package/esm2022/lib/vflow/interfaces/fit-view-options.interface.mjs +2 -0
- package/esm2022/lib/vflow/interfaces/rect.mjs +2 -0
- package/esm2022/lib/vflow/interfaces/viewport.interface.mjs +1 -1
- package/esm2022/lib/vflow/services/flow-settings.service.mjs +12 -4
- package/esm2022/lib/vflow/services/node-changes.service.mjs +3 -3
- package/esm2022/lib/vflow/services/viewport.service.mjs +26 -3
- package/esm2022/lib/vflow/utils/nodes.mjs +36 -0
- package/esm2022/lib/vflow/utils/viewport.mjs +15 -0
- package/esm2022/lib/vflow/vflow.module.mjs +6 -3
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ngx-vflow.mjs +215 -97
- package/fesm2022/ngx-vflow.mjs.map +1 -1
- package/lib/vflow/components/vflow/vflow.component.d.ts +4 -4
- package/lib/vflow/directives/flow-size-controller.directive.d.ts +10 -0
- package/lib/vflow/directives/map-context.directive.d.ts +9 -3
- package/lib/vflow/interfaces/box.d.ts +6 -0
- package/lib/vflow/interfaces/fit-view-options.interface.d.ts +15 -0
- package/lib/vflow/interfaces/rect.d.ts +6 -0
- package/lib/vflow/interfaces/viewport.interface.d.ts +1 -0
- package/lib/vflow/models/edge.model.d.ts +17 -1
- package/lib/vflow/services/flow-settings.service.d.ts +10 -2
- package/lib/vflow/services/viewport.service.d.ts +5 -0
- package/lib/vflow/utils/nodes.d.ts +3 -0
- package/lib/vflow/utils/viewport.d.ts +4 -0
- package/lib/vflow/vflow.module.d.ts +4 -3
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function getNodesBounds(nodes) {
|
|
2
|
+
if (nodes.length === 0) {
|
|
3
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
4
|
+
}
|
|
5
|
+
let box = { x: Infinity, y: Infinity, x2: -Infinity, y2: -Infinity };
|
|
6
|
+
nodes.forEach(node => {
|
|
7
|
+
const nodeBox = nodeToBox(node);
|
|
8
|
+
box = getBoundsOfBoxes(box, nodeBox);
|
|
9
|
+
});
|
|
10
|
+
return boxToRect(box);
|
|
11
|
+
}
|
|
12
|
+
function nodeToBox(node) {
|
|
13
|
+
return {
|
|
14
|
+
x: node.point().x,
|
|
15
|
+
y: node.point().y,
|
|
16
|
+
x2: node.point().x + node.size().width,
|
|
17
|
+
y2: node.point().y + node.size().height,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function boxToRect({ x, y, x2, y2 }) {
|
|
21
|
+
return {
|
|
22
|
+
x,
|
|
23
|
+
y,
|
|
24
|
+
width: x2 - x,
|
|
25
|
+
height: y2 - y,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function getBoundsOfBoxes(box1, box2) {
|
|
29
|
+
return {
|
|
30
|
+
x: Math.min(box1.x, box2.x),
|
|
31
|
+
y: Math.min(box1.y, box2.y),
|
|
32
|
+
x2: Math.max(box1.x2, box2.x2),
|
|
33
|
+
y2: Math.max(box1.y2, box2.y2),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvdXRpbHMvbm9kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFrQjtJQUMvQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUE7S0FDM0M7SUFFRCxJQUFJLEdBQUcsR0FBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUE7SUFFekUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNuQixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDL0IsR0FBRyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN0QyxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFlO0lBQ2hDLE9BQU87UUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO1FBQ3RDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNO0tBQ3hDLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQU87SUFDdEMsT0FBTztRQUNMLENBQUM7UUFDRCxDQUFDO1FBQ0QsS0FBSyxFQUFFLEVBQUUsR0FBRyxDQUFDO1FBQ2IsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDO0tBQ2YsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQVMsRUFBRSxJQUFTO0lBQzVDLE9BQU87UUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNCLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5QixFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7S0FDL0IsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb3ggfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9ib3hcIjtcbmltcG9ydCB7IFJlY3QgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9yZWN0XCI7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL25vZGUubW9kZWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVzQm91bmRzKG5vZGVzOiBOb2RlTW9kZWxbXSk6IFJlY3Qge1xuICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9XG4gIH1cblxuICBsZXQgYm94OiBCb3ggPSB7IHg6IEluZmluaXR5LCB5OiBJbmZpbml0eSwgeDI6IC1JbmZpbml0eSwgeTI6IC1JbmZpbml0eSB9XG5cbiAgbm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICBjb25zdCBub2RlQm94ID0gbm9kZVRvQm94KG5vZGUpXG4gICAgYm94ID0gZ2V0Qm91bmRzT2ZCb3hlcyhib3gsIG5vZGVCb3gpXG4gIH0pXG5cbiAgcmV0dXJuIGJveFRvUmVjdChib3gpXG59XG5cbmZ1bmN0aW9uIG5vZGVUb0JveChub2RlOiBOb2RlTW9kZWwpOiBCb3gge1xuICByZXR1cm4ge1xuICAgIHg6IG5vZGUucG9pbnQoKS54LFxuICAgIHk6IG5vZGUucG9pbnQoKS55LFxuICAgIHgyOiBub2RlLnBvaW50KCkueCArIG5vZGUuc2l6ZSgpLndpZHRoLFxuICAgIHkyOiBub2RlLnBvaW50KCkueSArIG5vZGUuc2l6ZSgpLmhlaWdodCxcbiAgfVxufVxuXG5mdW5jdGlvbiBib3hUb1JlY3QoeyB4LCB5LCB4MiwgeTIgfTogQm94KTogUmVjdCB7XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoOiB4MiAtIHgsXG4gICAgaGVpZ2h0OiB5MiAtIHksXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qm91bmRzT2ZCb3hlcyhib3gxOiBCb3gsIGJveDI6IEJveCk6IEJveCB7XG4gIHJldHVybiB7XG4gICAgeDogTWF0aC5taW4oYm94MS54LCBib3gyLngpLFxuICAgIHk6IE1hdGgubWluKGJveDEueSwgYm94Mi55KSxcbiAgICB4MjogTWF0aC5tYXgoYm94MS54MiwgYm94Mi54MiksXG4gICAgeTI6IE1hdGgubWF4KGJveDEueTIsIGJveDIueTIpLFxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function getViewportForBounds(bounds, width, height, minZoom, maxZoom, padding) {
|
|
2
|
+
const xZoom = width / (bounds.width * (1 + padding));
|
|
3
|
+
const yZoom = height / (bounds.height * (1 + padding));
|
|
4
|
+
const zoom = Math.min(xZoom, yZoom);
|
|
5
|
+
const clampedZoom = clamp(zoom, minZoom, maxZoom);
|
|
6
|
+
const boundsCenterX = bounds.x + bounds.width / 2;
|
|
7
|
+
const boundsCenterY = bounds.y + bounds.height / 2;
|
|
8
|
+
const x = width / 2 - boundsCenterX * clampedZoom;
|
|
9
|
+
const y = height / 2 - boundsCenterY * clampedZoom;
|
|
10
|
+
return { x, y, zoom: clampedZoom };
|
|
11
|
+
}
|
|
12
|
+
export function clamp(value, min = 0, max = 1) {
|
|
13
|
+
return Math.min(Math.max(value, min), max);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvdXRpbHMvdmlld3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUFZLEVBQ1osS0FBYSxFQUNiLE1BQWMsRUFDZCxPQUFlLEVBQ2YsT0FBZSxFQUNmLE9BQWU7SUFFZixNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNuRCxNQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLGFBQWEsR0FBRyxXQUFXLENBQUM7SUFDbEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxhQUFhLEdBQUcsV0FBVyxDQUFDO0lBRW5ELE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUVyQyxDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUNuRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlY3QgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9yZWN0XCI7XG5pbXBvcnQgeyBWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvdmlld3BvcnQuaW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydEZvckJvdW5kcyhcbiAgYm91bmRzOiBSZWN0LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgbWluWm9vbTogbnVtYmVyLFxuICBtYXhab29tOiBudW1iZXIsXG4gIHBhZGRpbmc6IG51bWJlclxuKTogVmlld3BvcnRTdGF0ZSB7XG4gIGNvbnN0IHhab29tID0gd2lkdGggLyAoYm91bmRzLndpZHRoICogKDEgKyBwYWRkaW5nKSk7XG4gIGNvbnN0IHlab29tID0gaGVpZ2h0IC8gKGJvdW5kcy5oZWlnaHQgKiAoMSArIHBhZGRpbmcpKTtcbiAgY29uc3Qgem9vbSA9IE1hdGgubWluKHhab29tLCB5Wm9vbSk7XG4gIGNvbnN0IGNsYW1wZWRab29tID0gY2xhbXAoem9vbSwgbWluWm9vbSwgbWF4Wm9vbSk7XG4gIGNvbnN0IGJvdW5kc0NlbnRlclggPSBib3VuZHMueCArIGJvdW5kcy53aWR0aCAvIDI7XG4gIGNvbnN0IGJvdW5kc0NlbnRlclkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLyAyO1xuICBjb25zdCB4ID0gd2lkdGggLyAyIC0gYm91bmRzQ2VudGVyWCAqIGNsYW1wZWRab29tO1xuICBjb25zdCB5ID0gaGVpZ2h0IC8gMiAtIGJvdW5kc0NlbnRlclkgKiBjbGFtcGVkWm9vbTtcblxuICByZXR1cm4geyB4LCB5LCB6b29tOiBjbGFtcGVkWm9vbSB9O1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW4gPSAwLCBtYXggPSAxKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHZhbHVlLCBtaW4pLCBtYXgpXG59XG4iXX0=
|
|
@@ -17,6 +17,7 @@ import { SelectableDirective } from './directives/selectable.directive';
|
|
|
17
17
|
import { PointerDirective } from './directives/pointer.directive';
|
|
18
18
|
import { RootPointerDirective } from './directives/root-pointer.directive';
|
|
19
19
|
import { BackgroundComponent } from './components/background/background.component';
|
|
20
|
+
import { FlowSizeControllerDirective } from './directives/flow-size-controller.directive';
|
|
20
21
|
import * as i0 from "@angular/core";
|
|
21
22
|
const components = [
|
|
22
23
|
VflowComponent,
|
|
@@ -36,7 +37,8 @@ const directives = [
|
|
|
36
37
|
HandleSizeControllerDirective,
|
|
37
38
|
SelectableDirective,
|
|
38
39
|
PointerDirective,
|
|
39
|
-
RootPointerDirective
|
|
40
|
+
RootPointerDirective,
|
|
41
|
+
FlowSizeControllerDirective
|
|
40
42
|
];
|
|
41
43
|
const templateDirectives = [
|
|
42
44
|
NodeHtmlTemplateDirective,
|
|
@@ -61,7 +63,8 @@ export class VflowModule {
|
|
|
61
63
|
HandleSizeControllerDirective,
|
|
62
64
|
SelectableDirective,
|
|
63
65
|
PointerDirective,
|
|
64
|
-
RootPointerDirective,
|
|
66
|
+
RootPointerDirective,
|
|
67
|
+
FlowSizeControllerDirective, NodeHtmlTemplateDirective,
|
|
65
68
|
EdgeLabelHtmlTemplateDirective,
|
|
66
69
|
EdgeTemplateDirective,
|
|
67
70
|
ConnectionTemplateDirective,
|
|
@@ -87,4 +90,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
87
90
|
declarations: [...components, ...directives, ...templateDirectives],
|
|
88
91
|
}]
|
|
89
92
|
}] });
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZsb3cubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L3ZmbG93Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsOEJBQThCLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6TCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN4RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOztBQUUxRixNQUFNLFVBQVUsR0FBRztJQUNqQixjQUFjO0lBQ2QsYUFBYTtJQUNiLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixhQUFhO0lBQ2IsbUJBQW1CO0NBQ3BCLENBQUE7QUFFRCxNQUFNLFVBQVUsR0FBRztJQUNqQiwwQkFBMEI7SUFDMUIsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6Qix1QkFBdUI7SUFDdkIsNkJBQTZCO0lBQzdCLG1CQUFtQjtJQUNuQixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLDJCQUEyQjtDQUM1QixDQUFBO0FBRUQsTUFBTSxrQkFBa0IsR0FBRztJQUN6Qix5QkFBeUI7SUFDekIsOEJBQThCO0lBQzlCLHFCQUFxQjtJQUNyQiwyQkFBMkI7SUFDM0IsdUJBQXVCO0NBQ3hCLENBQUE7QUFZRCxNQUFNLE9BQU8sV0FBVzsrR0FBWCxXQUFXO2dIQUFYLFdBQVcsaUJBeEN0QixjQUFjO1lBQ2QsYUFBYTtZQUNiLGFBQWE7WUFDYixrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixhQUFhO1lBQ2IsbUJBQW1CLEVBSW5CLDBCQUEwQjtZQUMxQixtQkFBbUI7WUFDbkIseUJBQXlCO1lBQ3pCLHVCQUF1QjtZQUN2Qiw2QkFBNkI7WUFDN0IsbUJBQW1CO1lBQ25CLGdCQUFnQjtZQUNoQixvQkFBb0I7WUFDcEIsMkJBQTJCLEVBSTNCLHlCQUF5QjtZQUN6Qiw4QkFBOEI7WUFDOUIscUJBQXFCO1lBQ3JCLDJCQUEyQjtZQUMzQix1QkFBdUIsYUFJYixZQUFZLGFBRXBCLGNBQWM7WUFDZCxlQUFlO1lBQ2YsbUJBQW1CLEVBWnJCLHlCQUF5QjtZQUN6Qiw4QkFBOEI7WUFDOUIscUJBQXFCO1lBQ3JCLDJCQUEyQjtZQUMzQix1QkFBdUI7Z0hBYVosV0FBVyxZQVRaLFlBQVk7OzRGQVNYLFdBQVc7a0JBVnZCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUU7d0JBQ1AsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLG1CQUFtQjt3QkFDbkIsR0FBRyxrQkFBa0I7cUJBQ3RCO29CQUNELFlBQVksRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEdBQUcsVUFBVSxFQUFFLEdBQUcsa0JBQWtCLENBQUM7aUJBQ3BFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWZmxvd0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy92Zmxvdy92Zmxvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9ub2RlL25vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IE1hcENvbnRleHREaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvbWFwLWNvbnRleHQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEVkZ2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZWRnZS9lZGdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFZGdlTGFiZWxDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZWRnZS1sYWJlbC9lZGdlLWxhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb25uZWN0aW9uVGVtcGxhdGVEaXJlY3RpdmUsIEVkZ2VMYWJlbEh0bWxUZW1wbGF0ZURpcmVjdGl2ZSwgRWRnZVRlbXBsYXRlRGlyZWN0aXZlLCBIYW5kbGVUZW1wbGF0ZURpcmVjdGl2ZSwgTm9kZUh0bWxUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy90ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jb25uZWN0aW9uL2Nvbm5lY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFNwYWNlUG9pbnRDb250ZXh0RGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL3NwYWNlLXBvaW50LWNvbnRleHQuZGlyZWN0aXZlJztcbmltcG9ydCB7IFJvb3RTdmdSZWZlcmVuY2VEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvcmVmZXJlbmNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBSb290U3ZnQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9yb290LXN2Zy1jb250ZXh0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEZWZzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2RlZnMvZGVmcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2hhbmRsZS9oYW5kbGUuY29tcG9uZW50JztcbmltcG9ydCB7IEhhbmRsZVNpemVDb250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2hhbmRsZS1zaXplLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNlbGVjdGFibGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvc2VsZWN0YWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9wb2ludGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBSb290UG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9yb290LXBvaW50ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEJhY2tncm91bmRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYmFja2dyb3VuZC9iYWNrZ3JvdW5kLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGbG93U2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvZmxvdy1zaXplLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcblxuY29uc3QgY29tcG9uZW50cyA9IFtcbiAgVmZsb3dDb21wb25lbnQsXG4gIE5vZGVDb21wb25lbnQsXG4gIEVkZ2VDb21wb25lbnQsXG4gIEVkZ2VMYWJlbENvbXBvbmVudCxcbiAgQ29ubmVjdGlvbkNvbXBvbmVudCxcbiAgSGFuZGxlQ29tcG9uZW50LFxuICBEZWZzQ29tcG9uZW50LFxuICBCYWNrZ3JvdW5kQ29tcG9uZW50XG5dXG5cbmNvbnN0IGRpcmVjdGl2ZXMgPSBbXG4gIFNwYWNlUG9pbnRDb250ZXh0RGlyZWN0aXZlLFxuICBNYXBDb250ZXh0RGlyZWN0aXZlLFxuICBSb290U3ZnUmVmZXJlbmNlRGlyZWN0aXZlLFxuICBSb290U3ZnQ29udGV4dERpcmVjdGl2ZSxcbiAgSGFuZGxlU2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUsXG4gIFNlbGVjdGFibGVEaXJlY3RpdmUsXG4gIFBvaW50ZXJEaXJlY3RpdmUsXG4gIFJvb3RQb2ludGVyRGlyZWN0aXZlLFxuICBGbG93U2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmVcbl1cblxuY29uc3QgdGVtcGxhdGVEaXJlY3RpdmVzID0gW1xuICBOb2RlSHRtbFRlbXBsYXRlRGlyZWN0aXZlLFxuICBFZGdlTGFiZWxIdG1sVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEVkZ2VUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQ29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlLFxuICBIYW5kbGVUZW1wbGF0ZURpcmVjdGl2ZVxuXVxuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZXhwb3J0czogW1xuICAgIFZmbG93Q29tcG9uZW50LFxuICAgIEhhbmRsZUNvbXBvbmVudCxcbiAgICBTZWxlY3RhYmxlRGlyZWN0aXZlLFxuICAgIC4uLnRlbXBsYXRlRGlyZWN0aXZlc1xuICBdLFxuICBkZWNsYXJhdGlvbnM6IFsuLi5jb21wb25lbnRzLCAuLi5kaXJlY3RpdmVzLCAuLi50ZW1wbGF0ZURpcmVjdGl2ZXNdLFxufSlcbmV4cG9ydCBjbGFzcyBWZmxvd01vZHVsZSB7IH1cbiJdfQ==
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -11,6 +11,7 @@ export * from './lib/vflow/interfaces/connection-settings.interface';
|
|
|
11
11
|
export * from './lib/vflow/interfaces/handle-positions.interface';
|
|
12
12
|
export * from './lib/vflow/interfaces/marker.interface';
|
|
13
13
|
export * from './lib/vflow/interfaces/component-node-event.interface';
|
|
14
|
+
export * from './lib/vflow/interfaces/fit-view-options.interface';
|
|
14
15
|
// Types
|
|
15
16
|
export * from './lib/vflow/types/node-change.type';
|
|
16
17
|
export * from './lib/vflow/types/edge-change.type';
|
|
@@ -26,4 +27,4 @@ export * from './lib/vflow/directives/template.directive';
|
|
|
26
27
|
export * from './lib/vflow/directives/connection-controller.directive';
|
|
27
28
|
export * from './lib/vflow/directives/changes-controller.directive';
|
|
28
29
|
export * from './lib/vflow/directives/selectable.directive';
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLGNBQWMsMEJBQTBCLENBQUM7QUFFekMsYUFBYTtBQUNiLGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsNkNBQTZDLENBQUM7QUFDNUQsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsc0RBQXNELENBQUM7QUFDckUsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLHlDQUF5QyxDQUFDO0FBRXhELGNBQWMsdURBQXVELENBQUM7QUFDdEUsY0FBYyxtREFBbUQsQ0FBQztBQUVsRSxRQUFRO0FBQ1IsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLHdDQUF3QyxDQUFDO0FBRXZELGFBQWE7QUFDYixjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyxxREFBcUQsQ0FBQztBQUVwRSxhQUFhO0FBQ2IsY0FBYywyQ0FBMkMsQ0FBQztBQUMxRCxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMscURBQXFELENBQUM7QUFDcEUsY0FBYyw2Q0FBNkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIE1vZHVsZXNcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L3ZmbG93Lm1vZHVsZSc7XG5cbi8vIEludGVyZmFjZXNcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L2ludGVyZmFjZXMvbm9kZS5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmZsb3cvaW50ZXJmYWNlcy9wb2ludC5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmZsb3cvaW50ZXJmYWNlcy9lZGdlLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi92Zmxvdy9pbnRlcmZhY2VzL2VkZ2UtbGFiZWwuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L2ludGVyZmFjZXMvY29ubmVjdGlvbi5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmZsb3cvaW50ZXJmYWNlcy9jb25uZWN0aW9uLmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi92Zmxvdy9pbnRlcmZhY2VzL2Nvbm5lY3Rpb24tc2V0dGluZ3MuaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L2ludGVyZmFjZXMvaGFuZGxlLXBvc2l0aW9ucy5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmZsb3cvaW50ZXJmYWNlcy9tYXJrZXIuaW50ZXJmYWNlJztcbmV4cG9ydCB7IFZpZXdwb3J0U3RhdGUgfSBmcm9tICcuL2xpYi92Zmxvdy9pbnRlcmZhY2VzL3ZpZXdwb3J0LmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi92Zmxvdy9pbnRlcmZhY2VzL2NvbXBvbmVudC1ub2RlLWV2ZW50LmludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi92Zmxvdy9pbnRlcmZhY2VzL2ZpdC12aWV3LW9wdGlvbnMuaW50ZXJmYWNlJztcblxuLy8gVHlwZXNcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L3R5cGVzL25vZGUtY2hhbmdlLnR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmZsb3cvdHlwZXMvZWRnZS1jaGFuZ2UudHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi92Zmxvdy90eXBlcy9wb3NpdGlvbi50eXBlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L3R5cGVzL2JhY2tncm91bmQudHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi92Zmxvdy90eXBlcy9jb25uZWN0aW9uLW1vZGUudHlwZSc7XG5cbi8vIENvbXBvbmVudHNcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L2NvbXBvbmVudHMvaGFuZGxlL2hhbmRsZS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmZsb3cvcHVibGljLWNvbXBvbmVudHMvY3VzdG9tLW5vZGUuY29tcG9uZW50JztcblxuLy8gRGlyZWN0aXZlc1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmZsb3cvZGlyZWN0aXZlcy90ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdmZsb3cvZGlyZWN0aXZlcy9jb25uZWN0aW9uLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3ZmbG93L2RpcmVjdGl2ZXMvY2hhbmdlcy1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi92Zmxvdy9kaXJlY3RpdmVzL3NlbGVjdGFibGUuZGlyZWN0aXZlJztcbiJdfQ==
|
package/fesm2022/ngx-vflow.mjs
CHANGED
|
@@ -1,62 +1,50 @@
|
|
|
1
1
|
import * as i1 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { signal, Injectable, inject, ElementRef, Directive,
|
|
4
|
+
import { signal, computed, Injectable, inject, ElementRef, Directive, effect, untracked, TemplateRef, EventEmitter, Output, DestroyRef, Input, runInInjectionContext, Injector, Component, ChangeDetectionStrategy, HostListener, ViewChild, HostBinding, ContentChild, NgModule } from '@angular/core';
|
|
5
5
|
import { select } from 'd3-selection';
|
|
6
6
|
import { zoomIdentity, zoom } from 'd3-zoom';
|
|
7
|
-
import { Subject, tap, merge, BehaviorSubject, observeOn, animationFrameScheduler, switchMap, skip, map, pairwise, filter, distinctUntilChanged,
|
|
7
|
+
import { Subject, tap, merge, BehaviorSubject, observeOn, animationFrameScheduler, switchMap, skip, map, pairwise, filter, distinctUntilChanged, zip, asyncScheduler, fromEvent, share, Observable, startWith } from 'rxjs';
|
|
8
8
|
import { takeUntilDestroyed, toSignal, toObservable } from '@angular/core/rxjs-interop';
|
|
9
9
|
import { drag } from 'd3-drag';
|
|
10
10
|
import { path } from 'd3-path';
|
|
11
11
|
import { __decorate } from 'tslib';
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Public signal with viewport state. User can directly read from this signal. It's updated by:
|
|
25
|
-
* - user events on flow
|
|
26
|
-
* - writableViewport signal
|
|
27
|
-
*/
|
|
28
|
-
this.readableViewport = signal(ViewportService.getDefaultViewport());
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* The default value used by d3, just copy it here
|
|
32
|
-
*
|
|
33
|
-
* @returns default viewport value
|
|
34
|
-
*/
|
|
35
|
-
static getDefaultViewport() { return { zoom: 1, x: 0, y: 0 }; }
|
|
36
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
37
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewportService }); }
|
|
13
|
+
function getNodesBounds(nodes) {
|
|
14
|
+
if (nodes.length === 0) {
|
|
15
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
16
|
+
}
|
|
17
|
+
let box = { x: Infinity, y: Infinity, x2: -Infinity, y2: -Infinity };
|
|
18
|
+
nodes.forEach(node => {
|
|
19
|
+
const nodeBox = nodeToBox(node);
|
|
20
|
+
box = getBoundsOfBoxes(box, nodeBox);
|
|
21
|
+
});
|
|
22
|
+
return boxToRect(box);
|
|
38
23
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
24
|
+
function nodeToBox(node) {
|
|
25
|
+
return {
|
|
26
|
+
x: node.point().x,
|
|
27
|
+
y: node.point().y,
|
|
28
|
+
x2: node.point().x + node.size().width,
|
|
29
|
+
y2: node.point().y + node.size().height,
|
|
30
|
+
};
|
|
45
31
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
32
|
+
function boxToRect({ x, y, x2, y2 }) {
|
|
33
|
+
return {
|
|
34
|
+
x,
|
|
35
|
+
y,
|
|
36
|
+
width: x2 - x,
|
|
37
|
+
height: y2 - y,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function getBoundsOfBoxes(box1, box2) {
|
|
41
|
+
return {
|
|
42
|
+
x: Math.min(box1.x, box2.x),
|
|
43
|
+
y: Math.min(box1.y, box2.y),
|
|
44
|
+
x2: Math.max(box1.x2, box2.x2),
|
|
45
|
+
y2: Math.max(box1.y2, box2.y2),
|
|
46
|
+
};
|
|
53
47
|
}
|
|
54
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RootSvgReferenceDirective, decorators: [{
|
|
55
|
-
type: Directive,
|
|
56
|
-
args: [{
|
|
57
|
-
selector: 'svg[rootSvgRef]'
|
|
58
|
-
}]
|
|
59
|
-
}] });
|
|
60
48
|
|
|
61
49
|
class ConnectionModel {
|
|
62
50
|
constructor(settings) {
|
|
@@ -148,6 +136,119 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
148
136
|
type: Injectable
|
|
149
137
|
}] });
|
|
150
138
|
|
|
139
|
+
function getViewportForBounds(bounds, width, height, minZoom, maxZoom, padding) {
|
|
140
|
+
const xZoom = width / (bounds.width * (1 + padding));
|
|
141
|
+
const yZoom = height / (bounds.height * (1 + padding));
|
|
142
|
+
const zoom = Math.min(xZoom, yZoom);
|
|
143
|
+
const clampedZoom = clamp(zoom, minZoom, maxZoom);
|
|
144
|
+
const boundsCenterX = bounds.x + bounds.width / 2;
|
|
145
|
+
const boundsCenterY = bounds.y + bounds.height / 2;
|
|
146
|
+
const x = width / 2 - boundsCenterX * clampedZoom;
|
|
147
|
+
const y = height / 2 - boundsCenterY * clampedZoom;
|
|
148
|
+
return { x, y, zoom: clampedZoom };
|
|
149
|
+
}
|
|
150
|
+
function clamp(value, min = 0, max = 1) {
|
|
151
|
+
return Math.min(Math.max(value, min), max);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
class FlowSettingsService {
|
|
155
|
+
constructor() {
|
|
156
|
+
this.entitiesSelectable = signal(true);
|
|
157
|
+
/**
|
|
158
|
+
* Global setting with handle positions. Nodes derive this value
|
|
159
|
+
*
|
|
160
|
+
* @deprecated
|
|
161
|
+
*/
|
|
162
|
+
this.handlePositions = signal({ source: 'right', target: 'left' });
|
|
163
|
+
/**
|
|
164
|
+
* @see {VflowComponent.view}
|
|
165
|
+
*/
|
|
166
|
+
this.view = signal([400, 400]);
|
|
167
|
+
/**
|
|
168
|
+
* Set based on view property. May change if view is 'auto'
|
|
169
|
+
*/
|
|
170
|
+
this.computedFlowWidth = signal(0);
|
|
171
|
+
/**
|
|
172
|
+
* Set based on view property. May change if view is 'auto'
|
|
173
|
+
*/
|
|
174
|
+
this.computedFlowHeight = signal(0);
|
|
175
|
+
this.minZoom = signal(0.5);
|
|
176
|
+
this.maxZoom = signal(3);
|
|
177
|
+
}
|
|
178
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FlowSettingsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
179
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FlowSettingsService }); }
|
|
180
|
+
}
|
|
181
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FlowSettingsService, decorators: [{
|
|
182
|
+
type: Injectable
|
|
183
|
+
}] });
|
|
184
|
+
|
|
185
|
+
class ViewportService {
|
|
186
|
+
constructor() {
|
|
187
|
+
this.entitiesService = inject(FlowEntitiesService);
|
|
188
|
+
this.flowSettingsService = inject(FlowSettingsService);
|
|
189
|
+
/**
|
|
190
|
+
* Internal signal that accepts value from user by lib api
|
|
191
|
+
* When this signal changes, lib sets new view state and update readableViewport signal
|
|
192
|
+
*/
|
|
193
|
+
this.writableViewport = signal({
|
|
194
|
+
changeType: 'initial',
|
|
195
|
+
state: ViewportService.getDefaultViewport(),
|
|
196
|
+
duration: 0
|
|
197
|
+
});
|
|
198
|
+
/**
|
|
199
|
+
* Public signal with viewport state. User can directly read from this signal. It's updated by:
|
|
200
|
+
* - user events on flow
|
|
201
|
+
* - writableViewport signal
|
|
202
|
+
*/
|
|
203
|
+
this.readableViewport = signal(ViewportService.getDefaultViewport());
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* The default value used by d3, just copy it here
|
|
207
|
+
*
|
|
208
|
+
* @returns default viewport value
|
|
209
|
+
*/
|
|
210
|
+
static getDefaultViewport() { return { zoom: 1, x: 0, y: 0 }; }
|
|
211
|
+
// TODO: add writableViewportWithConstraints (to apply min zoom/max zoom values)
|
|
212
|
+
fitView(options = { padding: .1, duration: 0, nodes: [] }) {
|
|
213
|
+
const nodes = this.getBoundsNodes(options.nodes ?? []);
|
|
214
|
+
const state = getViewportForBounds(getNodesBounds(nodes), this.flowSettingsService.computedFlowWidth(), this.flowSettingsService.computedFlowHeight(), this.flowSettingsService.minZoom(), this.flowSettingsService.maxZoom(), options.padding ?? .1);
|
|
215
|
+
const duration = options.duration ?? 0;
|
|
216
|
+
this.writableViewport.set({ changeType: 'absolute', state, duration });
|
|
217
|
+
}
|
|
218
|
+
getBoundsNodes(nodeIds) {
|
|
219
|
+
return !nodeIds?.length
|
|
220
|
+
// If nodes option not passed or the list is empty, then get fit the whole view
|
|
221
|
+
? this.entitiesService.nodes()
|
|
222
|
+
// Otherwise fit to specific nodes
|
|
223
|
+
: nodeIds
|
|
224
|
+
.map(nodeId => this.entitiesService.nodes().find(({ node }) => node.id === nodeId))
|
|
225
|
+
.filter((node) => !!node);
|
|
226
|
+
}
|
|
227
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
228
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewportService }); }
|
|
229
|
+
}
|
|
230
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewportService, decorators: [{
|
|
231
|
+
type: Injectable
|
|
232
|
+
}] });
|
|
233
|
+
|
|
234
|
+
function isDefined(data) {
|
|
235
|
+
return data !== undefined;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
class RootSvgReferenceDirective {
|
|
239
|
+
constructor() {
|
|
240
|
+
this.element = inject(ElementRef).nativeElement;
|
|
241
|
+
}
|
|
242
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RootSvgReferenceDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
243
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: RootSvgReferenceDirective, selector: "svg[rootSvgRef]", ngImport: i0 }); }
|
|
244
|
+
}
|
|
245
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RootSvgReferenceDirective, decorators: [{
|
|
246
|
+
type: Directive,
|
|
247
|
+
args: [{
|
|
248
|
+
selector: 'svg[rootSvgRef]'
|
|
249
|
+
}]
|
|
250
|
+
}] });
|
|
251
|
+
|
|
151
252
|
class SelectionService {
|
|
152
253
|
constructor() {
|
|
153
254
|
this.flowEntitiesService = inject(FlowEntitiesService);
|
|
@@ -194,6 +295,7 @@ class MapContextDirective {
|
|
|
194
295
|
this.host = inject(ElementRef).nativeElement;
|
|
195
296
|
this.selectionService = inject(SelectionService);
|
|
196
297
|
this.viewportService = inject(ViewportService);
|
|
298
|
+
this.flowSettingsService = inject(FlowSettingsService);
|
|
197
299
|
this.rootSvgSelection = select(this.rootSvg);
|
|
198
300
|
this.zoomableSelection = select(this.host);
|
|
199
301
|
this.viewportForSelection = {};
|
|
@@ -206,19 +308,25 @@ class MapContextDirective {
|
|
|
206
308
|
}
|
|
207
309
|
// If only zoom provided
|
|
208
310
|
if (isDefined(state.zoom) && (!isDefined(state.x) && !isDefined(state.y))) {
|
|
209
|
-
this.rootSvgSelection
|
|
311
|
+
this.rootSvgSelection
|
|
312
|
+
.transition().duration(viewport.duration)
|
|
313
|
+
.call(this.zoomBehavior.scaleTo, state.zoom);
|
|
210
314
|
return;
|
|
211
315
|
}
|
|
212
316
|
// If only pan provided
|
|
213
317
|
if ((isDefined(state.x) && isDefined(state.y)) && !isDefined(state.zoom)) {
|
|
214
318
|
// remain same zoom value
|
|
215
319
|
const zoom = untracked(this.viewportService.readableViewport).zoom;
|
|
216
|
-
this.rootSvgSelection
|
|
320
|
+
this.rootSvgSelection
|
|
321
|
+
.transition().duration(viewport.duration)
|
|
322
|
+
.call(this.zoomBehavior.transform, zoomIdentity.translate(state.x, state.y).scale(zoom));
|
|
217
323
|
return;
|
|
218
324
|
}
|
|
219
325
|
// If whole viewort state provided
|
|
220
326
|
if (isDefined(state.x) && isDefined(state.y) && isDefined(state.zoom)) {
|
|
221
|
-
this.rootSvgSelection
|
|
327
|
+
this.rootSvgSelection
|
|
328
|
+
.transition().duration(viewport.duration)
|
|
329
|
+
.call(this.zoomBehavior.transform, zoomIdentity.translate(state.x, state.y).scale(state.zoom));
|
|
222
330
|
return;
|
|
223
331
|
}
|
|
224
332
|
}, { allowSignalWrites: true });
|
|
@@ -230,7 +338,7 @@ class MapContextDirective {
|
|
|
230
338
|
}
|
|
231
339
|
ngOnInit() {
|
|
232
340
|
this.zoomBehavior = zoom()
|
|
233
|
-
.scaleExtent([this.minZoom, this.maxZoom])
|
|
341
|
+
.scaleExtent([this.flowSettingsService.minZoom(), this.flowSettingsService.maxZoom()])
|
|
234
342
|
.on('start', (event) => this.onD3zoomStart(event))
|
|
235
343
|
.on('zoom', (event) => this.handleZoom(event))
|
|
236
344
|
.on('end', (event) => this.onD3zoomEnd(event));
|
|
@@ -252,16 +360,12 @@ class MapContextDirective {
|
|
|
252
360
|
this.selectionService.setViewport(this.viewportForSelection);
|
|
253
361
|
}
|
|
254
362
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapContextDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
255
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: MapContextDirective, selector: "g[mapContext]",
|
|
363
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: MapContextDirective, selector: "g[mapContext]", ngImport: i0 }); }
|
|
256
364
|
}
|
|
257
365
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapContextDirective, decorators: [{
|
|
258
366
|
type: Directive,
|
|
259
367
|
args: [{ selector: 'g[mapContext]' }]
|
|
260
|
-
}]
|
|
261
|
-
type: Input
|
|
262
|
-
}], maxZoom: [{
|
|
263
|
-
type: Input
|
|
264
|
-
}] } });
|
|
368
|
+
}] });
|
|
265
369
|
const mapTransformToViewportState = (transform) => ({ zoom: transform.k, x: transform.x, y: transform.y });
|
|
266
370
|
const evTarget = (anyEvent) => {
|
|
267
371
|
if (anyEvent instanceof Event && anyEvent.target instanceof Element) {
|
|
@@ -587,29 +691,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
587
691
|
type: Output
|
|
588
692
|
}] } });
|
|
589
693
|
|
|
590
|
-
class FlowSettingsService {
|
|
591
|
-
constructor() {
|
|
592
|
-
this.entitiesSelectable = signal(true);
|
|
593
|
-
/**
|
|
594
|
-
* Global setting with handle positions. Nodes derive this value
|
|
595
|
-
*
|
|
596
|
-
* @deprecated
|
|
597
|
-
*/
|
|
598
|
-
this.handlePositions = signal({ source: 'right', target: 'left' });
|
|
599
|
-
/**
|
|
600
|
-
* @see {VflowComponent.view}
|
|
601
|
-
*/
|
|
602
|
-
this.view = signal([400, 400]);
|
|
603
|
-
this.flowWidth = computed(() => this.view() === 'auto' ? '100%' : this.view()[0]);
|
|
604
|
-
this.flowHeight = computed(() => this.view() === 'auto' ? '100%' : this.view()[1]);
|
|
605
|
-
}
|
|
606
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FlowSettingsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
607
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FlowSettingsService }); }
|
|
608
|
-
}
|
|
609
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FlowSettingsService, decorators: [{
|
|
610
|
-
type: Injectable
|
|
611
|
-
}] });
|
|
612
|
-
|
|
613
694
|
class ComponentEventBusService {
|
|
614
695
|
constructor() {
|
|
615
696
|
this._event$ = new Subject();
|
|
@@ -962,7 +1043,7 @@ class NodesChangeService {
|
|
|
962
1043
|
this.changes$ = merge(this.nodesPositionChange$, this.nodeAddChange$, this.nodeRemoveChange$, this.nodeSelectedChange$).pipe(
|
|
963
1044
|
// this fixes a bug when on fire node event change,
|
|
964
1045
|
// you can't get valid list of detached edges
|
|
965
|
-
observeOn(
|
|
1046
|
+
observeOn(animationFrameScheduler));
|
|
966
1047
|
}
|
|
967
1048
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodesChangeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
968
1049
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodesChangeService }); }
|
|
@@ -1950,6 +2031,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1950
2031
|
args: ['document:touchend']
|
|
1951
2032
|
}] } });
|
|
1952
2033
|
|
|
2034
|
+
class FlowSizeControllerDirective {
|
|
2035
|
+
constructor() {
|
|
2036
|
+
this.host = inject(ElementRef);
|
|
2037
|
+
this.flowSettingsService = inject(FlowSettingsService);
|
|
2038
|
+
this.flowWidth = 0;
|
|
2039
|
+
this.flowHeight = 0;
|
|
2040
|
+
effect(() => {
|
|
2041
|
+
const view = this.flowSettingsService.view();
|
|
2042
|
+
this.flowWidth = view === 'auto' ? '100%' : view[0];
|
|
2043
|
+
this.flowHeight = view === 'auto' ? '100%' : view[1];
|
|
2044
|
+
});
|
|
2045
|
+
resizable([this.host.nativeElement]).pipe(tap(([entry]) => {
|
|
2046
|
+
this.flowSettingsService.computedFlowWidth.set(entry.contentRect.width);
|
|
2047
|
+
this.flowSettingsService.computedFlowHeight.set(entry.contentRect.height);
|
|
2048
|
+
}), takeUntilDestroyed()).subscribe();
|
|
2049
|
+
}
|
|
2050
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FlowSizeControllerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
2051
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: FlowSizeControllerDirective, selector: "svg[flowSizeController]", host: { properties: { "attr.width": "this.flowWidth", "attr.height": "this.flowHeight" } }, ngImport: i0 }); }
|
|
2052
|
+
}
|
|
2053
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FlowSizeControllerDirective, decorators: [{
|
|
2054
|
+
type: Directive,
|
|
2055
|
+
args: [{ selector: 'svg[flowSizeController]' }]
|
|
2056
|
+
}], ctorParameters: function () { return []; }, propDecorators: { flowWidth: [{
|
|
2057
|
+
type: HostBinding,
|
|
2058
|
+
args: ['attr.width']
|
|
2059
|
+
}], flowHeight: [{
|
|
2060
|
+
type: HostBinding,
|
|
2061
|
+
args: ['attr.height']
|
|
2062
|
+
}] } });
|
|
2063
|
+
|
|
1953
2064
|
const connectionControllerHostDirective = {
|
|
1954
2065
|
directive: ConnectionControllerDirective,
|
|
1955
2066
|
outputs: ['onConnect']
|
|
@@ -1996,14 +2107,6 @@ class VflowComponent {
|
|
|
1996
2107
|
this.flowSettingsService = inject(FlowSettingsService);
|
|
1997
2108
|
this.componentEventBusService = inject(ComponentEventBusService);
|
|
1998
2109
|
this.injector = inject(Injector);
|
|
1999
|
-
/**
|
|
2000
|
-
* Minimum zoom value
|
|
2001
|
-
*/
|
|
2002
|
-
this.minZoom = 0.5;
|
|
2003
|
-
/**
|
|
2004
|
-
* Maximum zoom value
|
|
2005
|
-
*/
|
|
2006
|
-
this.maxZoom = 3;
|
|
2007
2110
|
/**
|
|
2008
2111
|
* Background for flow
|
|
2009
2112
|
*/
|
|
@@ -2048,8 +2151,6 @@ class VflowComponent {
|
|
|
2048
2151
|
*/
|
|
2049
2152
|
this.edgesChange$ = this.edgesChangeService.changes$;
|
|
2050
2153
|
// #endregion
|
|
2051
|
-
this.flowWidth = this.flowSettingsService.flowWidth;
|
|
2052
|
-
this.flowHeight = this.flowSettingsService.flowHeight;
|
|
2053
2154
|
this.markers = this.flowEntitiesService.markers;
|
|
2054
2155
|
}
|
|
2055
2156
|
// #endregion
|
|
@@ -2064,6 +2165,18 @@ class VflowComponent {
|
|
|
2064
2165
|
set view(view) {
|
|
2065
2166
|
this.flowSettingsService.view.set(view);
|
|
2066
2167
|
}
|
|
2168
|
+
/**
|
|
2169
|
+
* Minimum zoom value
|
|
2170
|
+
*/
|
|
2171
|
+
set minZoom(value) {
|
|
2172
|
+
this.flowSettingsService.minZoom.set(value);
|
|
2173
|
+
}
|
|
2174
|
+
/**
|
|
2175
|
+
* Maximum zoom value
|
|
2176
|
+
*/
|
|
2177
|
+
set maxZoom(value) {
|
|
2178
|
+
this.flowSettingsService.maxZoom.set(value);
|
|
2179
|
+
}
|
|
2067
2180
|
/**
|
|
2068
2181
|
* Object that controls flow direction.
|
|
2069
2182
|
*
|
|
@@ -2115,7 +2228,7 @@ class VflowComponent {
|
|
|
2115
2228
|
* @param viewport viewport state
|
|
2116
2229
|
*/
|
|
2117
2230
|
viewportTo(viewport) {
|
|
2118
|
-
this.viewportService.writableViewport.set({ changeType: 'absolute', state: viewport });
|
|
2231
|
+
this.viewportService.writableViewport.set({ changeType: 'absolute', state: viewport, duration: 0 });
|
|
2119
2232
|
}
|
|
2120
2233
|
/**
|
|
2121
2234
|
* Change zoom
|
|
@@ -2123,7 +2236,7 @@ class VflowComponent {
|
|
|
2123
2236
|
* @param zoom zoom value
|
|
2124
2237
|
*/
|
|
2125
2238
|
zoomTo(zoom) {
|
|
2126
|
-
this.viewportService.writableViewport.set({ changeType: 'absolute', state: { zoom } });
|
|
2239
|
+
this.viewportService.writableViewport.set({ changeType: 'absolute', state: { zoom }, duration: 0 });
|
|
2127
2240
|
}
|
|
2128
2241
|
/**
|
|
2129
2242
|
* Move to specified coordinate
|
|
@@ -2131,7 +2244,10 @@ class VflowComponent {
|
|
|
2131
2244
|
* @param point point where to move
|
|
2132
2245
|
*/
|
|
2133
2246
|
panTo(point) {
|
|
2134
|
-
this.viewportService.writableViewport.set({ changeType: 'absolute', state: point });
|
|
2247
|
+
this.viewportService.writableViewport.set({ changeType: 'absolute', state: point, duration: 0 });
|
|
2248
|
+
}
|
|
2249
|
+
fitView(options) {
|
|
2250
|
+
this.viewportService.fitView(options);
|
|
2135
2251
|
}
|
|
2136
2252
|
/**
|
|
2137
2253
|
* Get node by id
|
|
@@ -2172,7 +2288,7 @@ class VflowComponent {
|
|
|
2172
2288
|
SelectionService,
|
|
2173
2289
|
FlowSettingsService,
|
|
2174
2290
|
ComponentEventBusService
|
|
2175
|
-
], queries: [{ propertyName: "nodeHtmlDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true }, { propertyName: "spacePointContext", first: true, predicate: SpacePointContextDirective, descendants: true }], hostDirectives: [{ directive: ConnectionControllerDirective, outputs: ["onConnect", "onConnect"] }, { directive: ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onNodesChange.position", "onNodesChange.position", "onNodesChange.position.single", "onNodesChange.position.single", "onNodesChange.position.many", "onNodesChange.position.many", "onNodesChange.add", "onNodesChange.add", "onNodesChange.add.single", "onNodesChange.add.single", "onNodesChange.add.many", "onNodesChange.add.many", "onNodesChange.remove", "onNodesChange.remove", "onNodesChange.remove.single", "onNodesChange.remove.single", "onNodesChange.remove.many", "onNodesChange.remove.many", "onNodesChange.select", "onNodesChange.select", "onNodesChange.select.single", "onNodesChange.select.single", "onNodesChange.select.many", "onNodesChange.select.many", "onEdgesChange", "onEdgesChange", "onEdgesChange.detached", "onEdgesChange.detached", "onEdgesChange.detached.single", "onEdgesChange.detached.single", "onEdgesChange.detached.many", "onEdgesChange.detached.many", "onEdgesChange.add", "onEdgesChange.add", "onEdgesChange.add.single", "onEdgesChange.add.single", "onEdgesChange.add.many", "onEdgesChange.add.many", "onEdgesChange.remove", "onEdgesChange.remove", "onEdgesChange.remove.single", "onEdgesChange.remove.single", "onEdgesChange.remove.many", "onEdgesChange.remove.many", "onEdgesChange.select", "onEdgesChange.select", "onEdgesChange.select.single", "onEdgesChange.select.single", "onEdgesChange.select.many", "onEdgesChange.select.many"] }], ngImport: i0, template: "<svg:svg\n rootSvgRef\n rootSvgContext\n rootPointer\n class=\"root-svg\"\n #flow\n
|
|
2291
|
+
], queries: [{ propertyName: "nodeHtmlDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true }, { propertyName: "spacePointContext", first: true, predicate: SpacePointContextDirective, descendants: true }], hostDirectives: [{ directive: ConnectionControllerDirective, outputs: ["onConnect", "onConnect"] }, { directive: ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onNodesChange.position", "onNodesChange.position", "onNodesChange.position.single", "onNodesChange.position.single", "onNodesChange.position.many", "onNodesChange.position.many", "onNodesChange.add", "onNodesChange.add", "onNodesChange.add.single", "onNodesChange.add.single", "onNodesChange.add.many", "onNodesChange.add.many", "onNodesChange.remove", "onNodesChange.remove", "onNodesChange.remove.single", "onNodesChange.remove.single", "onNodesChange.remove.many", "onNodesChange.remove.many", "onNodesChange.select", "onNodesChange.select", "onNodesChange.select.single", "onNodesChange.select.single", "onNodesChange.select.many", "onNodesChange.select.many", "onEdgesChange", "onEdgesChange", "onEdgesChange.detached", "onEdgesChange.detached", "onEdgesChange.detached.single", "onEdgesChange.detached.single", "onEdgesChange.detached.many", "onEdgesChange.detached.many", "onEdgesChange.add", "onEdgesChange.add", "onEdgesChange.add.single", "onEdgesChange.add.single", "onEdgesChange.add.many", "onEdgesChange.add.many", "onEdgesChange.remove", "onEdgesChange.remove", "onEdgesChange.remove.single", "onEdgesChange.remove.single", "onEdgesChange.remove.many", "onEdgesChange.remove.many", "onEdgesChange.select", "onEdgesChange.select", "onEdgesChange.select.single", "onEdgesChange.select.single", "onEdgesChange.select.many", "onEdgesChange.select.many"] }], ngImport: i0, template: "<svg:svg\n rootSvgRef\n rootSvgContext\n rootPointer\n flowSizeController\n class=\"root-svg\"\n #flow\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <g [background]=\"background\"/>\n\n <svg:g\n mapContext\n spacePointContext\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels(); trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: NodeComponent, selector: "g[node]", inputs: ["nodeModel", "nodeHtmlTemplate"] }, { kind: "component", type: EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "component", type: ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "component", type: BackgroundComponent, selector: "g[background]", inputs: ["background"] }, { kind: "directive", type: SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "directive", type: MapContextDirective, selector: "g[mapContext]" }, { kind: "directive", type: RootSvgReferenceDirective, selector: "svg[rootSvgRef]" }, { kind: "directive", type: RootSvgContextDirective, selector: "svg[rootSvgContext]" }, { kind: "directive", type: RootPointerDirective, selector: "svg[rootPointer]" }, { kind: "directive", type: FlowSizeControllerDirective, selector: "svg[flowSizeController]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2176
2292
|
}
|
|
2177
2293
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VflowComponent, decorators: [{
|
|
2178
2294
|
type: Component,
|
|
@@ -2190,7 +2306,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2190
2306
|
], hostDirectives: [
|
|
2191
2307
|
connectionControllerHostDirective,
|
|
2192
2308
|
changesControllerHostDirective
|
|
2193
|
-
], template: "<svg:svg\n rootSvgRef\n rootSvgContext\n rootPointer\n class=\"root-svg\"\n #flow\n
|
|
2309
|
+
], template: "<svg:svg\n rootSvgRef\n rootSvgContext\n rootPointer\n flowSizeController\n class=\"root-svg\"\n #flow\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <g [background]=\"background\"/>\n\n <svg:g\n mapContext\n spacePointContext\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels(); trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeHtmlTemplate]=\"nodeHtmlDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"] }]
|
|
2194
2310
|
}], propDecorators: { view: [{
|
|
2195
2311
|
type: Input
|
|
2196
2312
|
}], minZoom: [{
|
|
@@ -2284,7 +2400,8 @@ const directives = [
|
|
|
2284
2400
|
HandleSizeControllerDirective,
|
|
2285
2401
|
SelectableDirective,
|
|
2286
2402
|
PointerDirective,
|
|
2287
|
-
RootPointerDirective
|
|
2403
|
+
RootPointerDirective,
|
|
2404
|
+
FlowSizeControllerDirective
|
|
2288
2405
|
];
|
|
2289
2406
|
const templateDirectives = [
|
|
2290
2407
|
NodeHtmlTemplateDirective,
|
|
@@ -2309,7 +2426,8 @@ class VflowModule {
|
|
|
2309
2426
|
HandleSizeControllerDirective,
|
|
2310
2427
|
SelectableDirective,
|
|
2311
2428
|
PointerDirective,
|
|
2312
|
-
RootPointerDirective,
|
|
2429
|
+
RootPointerDirective,
|
|
2430
|
+
FlowSizeControllerDirective, NodeHtmlTemplateDirective,
|
|
2313
2431
|
EdgeLabelHtmlTemplateDirective,
|
|
2314
2432
|
EdgeTemplateDirective,
|
|
2315
2433
|
ConnectionTemplateDirective,
|