ngx-vflow 1.9.0 → 1.10.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/connection/connection.component.mjs +33 -13
- package/esm2022/lib/vflow/components/edge/edge.component.mjs +3 -3
- package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +12 -8
- package/esm2022/lib/vflow/interfaces/curve-factory.interface.mjs +2 -0
- package/esm2022/lib/vflow/interfaces/edge.interface.mjs +1 -1
- package/esm2022/lib/vflow/math/edge-path/bezier-path.mjs +12 -14
- package/esm2022/lib/vflow/math/edge-path/smooth-step-path.mjs +5 -5
- package/esm2022/lib/vflow/math/edge-path/straigh-path.mjs +7 -9
- package/esm2022/lib/vflow/models/edge.model.mjs +24 -8
- package/esm2022/lib/vflow/services/edge-rendering.service.mjs +3 -1
- package/esm2022/lib/vflow/services/flow-entities.service.mjs +3 -1
- package/esm2022/lib/vflow/services/node-rendering.service.mjs +5 -1
- package/esm2022/lib/vflow/utils/entities-per-frame.mjs +2 -0
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ngx-vflow.mjs +93 -51
- package/fesm2022/ngx-vflow.mjs.map +1 -1
- package/lib/vflow/components/connection/connection.component.d.ts +4 -2
- package/lib/vflow/components/vflow/vflow.component.d.ts +4 -0
- package/lib/vflow/interfaces/curve-factory.interface.d.ts +44 -0
- package/lib/vflow/interfaces/edge.interface.d.ts +2 -1
- package/lib/vflow/math/edge-path/bezier-path.d.ts +2 -5
- package/lib/vflow/math/edge-path/smooth-step-path.d.ts +2 -3
- package/lib/vflow/math/edge-path/straigh-path.d.ts +2 -4
- package/lib/vflow/models/edge.model.d.ts +6 -4
- package/lib/vflow/services/edge-rendering.service.d.ts +1 -0
- package/lib/vflow/services/flow-entities.service.d.ts +3 -0
- package/lib/vflow/services/node-rendering.service.d.ts +3 -0
- package/lib/vflow/utils/entities-per-frame.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/esm2022/lib/vflow/interfaces/path-data.interface.mjs +0 -2
- package/esm2022/lib/vflow/types/using-points.type.mjs +0 -2
- package/lib/vflow/interfaces/path-data.interface.d.ts +0 -8
- package/lib/vflow/types/using-points.type.d.ts +0 -5
package/fesm2022/ngx-vflow.mjs
CHANGED
|
@@ -117,10 +117,12 @@ class FlowEntitiesService {
|
|
|
117
117
|
// empty arrays considered equal, other arrays may not be equal
|
|
118
118
|
equal: (a, b) => (!a.length && !b.length ? true : a === b),
|
|
119
119
|
});
|
|
120
|
+
this.rawNodes = computed(() => this.nodes().map((n) => n.rawNode));
|
|
120
121
|
this.edges = signal([], {
|
|
121
122
|
// empty arrays considered equal, other arrays may not be equal
|
|
122
123
|
equal: (a, b) => (!a.length && !b.length ? true : a === b),
|
|
123
124
|
});
|
|
125
|
+
this.rawEdges = computed(() => this.edges().map((e) => e.edge));
|
|
124
126
|
this.validEdges = computed(() => {
|
|
125
127
|
const nodes = this.nodes();
|
|
126
128
|
return this.edges().filter((e) => nodes.includes(e.source()) && nodes.includes(e.target()));
|
|
@@ -1097,25 +1099,23 @@ function getPointOnLineByRatio(start, end, ratio) {
|
|
|
1097
1099
|
};
|
|
1098
1100
|
}
|
|
1099
1101
|
|
|
1100
|
-
function straightPath(
|
|
1101
|
-
const [start, center, end] = usingPoints;
|
|
1102
|
-
const nullPoint = { x: 0, y: 0 };
|
|
1102
|
+
function straightPath({ sourcePoint, targetPoint }) {
|
|
1103
1103
|
return {
|
|
1104
|
-
path: `M ${
|
|
1105
|
-
|
|
1106
|
-
start:
|
|
1107
|
-
center:
|
|
1108
|
-
end:
|
|
1104
|
+
path: `M ${sourcePoint.x},${sourcePoint.y}L ${targetPoint.x},${targetPoint.y}`,
|
|
1105
|
+
labelPoints: {
|
|
1106
|
+
start: getPointOnLineByRatio(sourcePoint, targetPoint, 0.15),
|
|
1107
|
+
center: getPointOnLineByRatio(sourcePoint, targetPoint, 0.5),
|
|
1108
|
+
end: getPointOnLineByRatio(sourcePoint, targetPoint, 0.85),
|
|
1109
1109
|
},
|
|
1110
1110
|
};
|
|
1111
1111
|
}
|
|
1112
1112
|
|
|
1113
|
-
function bezierPath(
|
|
1114
|
-
const distanceVector = { x:
|
|
1115
|
-
const sourceControl = calcControlPoint(
|
|
1116
|
-
const targetControl = calcControlPoint(
|
|
1117
|
-
const path = `M${
|
|
1118
|
-
return getPathData(path,
|
|
1113
|
+
function bezierPath({ sourcePoint, targetPoint, sourcePosition, targetPosition, }) {
|
|
1114
|
+
const distanceVector = { x: sourcePoint.x - targetPoint.x, y: sourcePoint.y - targetPoint.y };
|
|
1115
|
+
const sourceControl = calcControlPoint(sourcePoint, sourcePosition, distanceVector);
|
|
1116
|
+
const targetControl = calcControlPoint(targetPoint, targetPosition, distanceVector);
|
|
1117
|
+
const path = `M${sourcePoint.x},${sourcePoint.y} C${sourceControl.x},${sourceControl.y} ${targetControl.x},${targetControl.y} ${targetPoint.x},${targetPoint.y}`;
|
|
1118
|
+
return getPathData(path, sourcePoint, targetPoint, sourceControl, targetControl);
|
|
1119
1119
|
}
|
|
1120
1120
|
/**
|
|
1121
1121
|
* Calculate control point based on provided point
|
|
@@ -1155,15 +1155,13 @@ function calcControlPoint(point, pointPosition, distanceVector) {
|
|
|
1155
1155
|
y: point.y - factorPoint.y * controlOffset,
|
|
1156
1156
|
};
|
|
1157
1157
|
}
|
|
1158
|
-
function getPathData(path, source, target, sourceControl, targetControl
|
|
1159
|
-
const [start, center, end] = usingPoints;
|
|
1160
|
-
const nullPoint = { x: 0, y: 0 };
|
|
1158
|
+
function getPathData(path, source, target, sourceControl, targetControl) {
|
|
1161
1159
|
return {
|
|
1162
1160
|
path,
|
|
1163
|
-
|
|
1164
|
-
start:
|
|
1165
|
-
center:
|
|
1166
|
-
end:
|
|
1161
|
+
labelPoints: {
|
|
1162
|
+
start: getPointOnBezier(source, target, sourceControl, targetControl, 0.1),
|
|
1163
|
+
center: getPointOnBezier(source, target, sourceControl, targetControl, 0.5),
|
|
1164
|
+
end: getPointOnBezier(source, target, sourceControl, targetControl, 0.9),
|
|
1167
1165
|
},
|
|
1168
1166
|
};
|
|
1169
1167
|
}
|
|
@@ -1317,11 +1315,11 @@ function getBend(a, b, c, size) {
|
|
|
1317
1315
|
const yDir = a.y < c.y ? -1 : 1;
|
|
1318
1316
|
return `L ${x},${y + bendSize * yDir}Q ${x},${y} ${x + bendSize * xDir},${y}`;
|
|
1319
1317
|
}
|
|
1320
|
-
function smoothStepPath(
|
|
1318
|
+
function smoothStepPath({ sourcePoint, targetPoint, sourcePosition, targetPosition }, borderRadius = 5) {
|
|
1321
1319
|
const [points, labelX, labelY] = getPoints({
|
|
1322
|
-
source,
|
|
1320
|
+
source: sourcePoint,
|
|
1323
1321
|
sourcePosition,
|
|
1324
|
-
target,
|
|
1322
|
+
target: targetPoint,
|
|
1325
1323
|
targetPosition,
|
|
1326
1324
|
offset: 20,
|
|
1327
1325
|
});
|
|
@@ -1338,7 +1336,7 @@ function smoothStepPath(source, target, sourcePosition, targetPosition, borderRa
|
|
|
1338
1336
|
}, '');
|
|
1339
1337
|
return {
|
|
1340
1338
|
path,
|
|
1341
|
-
|
|
1339
|
+
labelPoints: {
|
|
1342
1340
|
// TODO start and end points temporary unavailable for this path
|
|
1343
1341
|
start: { x: labelX, y: labelY },
|
|
1344
1342
|
center: { x: labelX, y: labelY },
|
|
@@ -1350,6 +1348,7 @@ function smoothStepPath(source, target, sourcePosition, targetPosition, borderRa
|
|
|
1350
1348
|
class EdgeModel {
|
|
1351
1349
|
constructor(edge) {
|
|
1352
1350
|
this.edge = edge;
|
|
1351
|
+
this.flowEntitiesService = inject(FlowEntitiesService);
|
|
1353
1352
|
this.source = signal(undefined);
|
|
1354
1353
|
this.target = signal(undefined);
|
|
1355
1354
|
this.selected = signal(false);
|
|
@@ -1385,22 +1384,25 @@ class EdgeModel {
|
|
|
1385
1384
|
if (!source || !target) {
|
|
1386
1385
|
return {
|
|
1387
1386
|
path: '',
|
|
1388
|
-
|
|
1387
|
+
labelPoints: {
|
|
1389
1388
|
start: { x: 0, y: 0 },
|
|
1390
1389
|
center: { x: 0, y: 0 },
|
|
1391
1390
|
end: { x: 0, y: 0 },
|
|
1392
1391
|
},
|
|
1393
1392
|
};
|
|
1394
1393
|
}
|
|
1394
|
+
const params = this.getPathFactoryParams(source, target);
|
|
1395
1395
|
switch (this.curve) {
|
|
1396
1396
|
case 'straight':
|
|
1397
|
-
return straightPath(
|
|
1397
|
+
return straightPath(params);
|
|
1398
1398
|
case 'bezier':
|
|
1399
|
-
return bezierPath(
|
|
1399
|
+
return bezierPath(params);
|
|
1400
1400
|
case 'smooth-step':
|
|
1401
|
-
return smoothStepPath(
|
|
1401
|
+
return smoothStepPath(params);
|
|
1402
1402
|
case 'step':
|
|
1403
|
-
return smoothStepPath(
|
|
1403
|
+
return smoothStepPath(params, 0);
|
|
1404
|
+
default:
|
|
1405
|
+
return this.curve(params);
|
|
1404
1406
|
}
|
|
1405
1407
|
});
|
|
1406
1408
|
this.sourceHandle = computed(() => {
|
|
@@ -1457,7 +1459,18 @@ class EdgeModel {
|
|
|
1457
1459
|
this.edgeLabels.center = new EdgeLabelModel(edge.edgeLabels.center);
|
|
1458
1460
|
if (edge.edgeLabels?.end)
|
|
1459
1461
|
this.edgeLabels.end = new EdgeLabelModel(edge.edgeLabels.end);
|
|
1460
|
-
|
|
1462
|
+
}
|
|
1463
|
+
getPathFactoryParams(source, target) {
|
|
1464
|
+
return {
|
|
1465
|
+
mode: 'edge',
|
|
1466
|
+
edge: this.edge,
|
|
1467
|
+
sourcePoint: source.pointAbsolute(),
|
|
1468
|
+
targetPoint: target.pointAbsolute(),
|
|
1469
|
+
sourcePosition: source.rawHandle.position,
|
|
1470
|
+
targetPosition: target.rawHandle.position,
|
|
1471
|
+
allEdges: this.flowEntitiesService.rawEdges(),
|
|
1472
|
+
allNodes: this.flowEntitiesService.rawNodes(),
|
|
1473
|
+
};
|
|
1461
1474
|
}
|
|
1462
1475
|
}
|
|
1463
1476
|
|
|
@@ -1724,6 +1737,8 @@ function isGroupNode(node) {
|
|
|
1724
1737
|
return node.rawNode.type === 'default-group' || node.rawNode.type === 'template-group';
|
|
1725
1738
|
}
|
|
1726
1739
|
|
|
1740
|
+
const entitiesPerFrame = (total, perFrame) => Math.max(1, Math.ceil(total / perFrame));
|
|
1741
|
+
|
|
1727
1742
|
class NodeRenderingService {
|
|
1728
1743
|
constructor() {
|
|
1729
1744
|
this.flowEntitiesService = inject(FlowEntitiesService);
|
|
@@ -1736,6 +1751,9 @@ class NodeRenderingService {
|
|
|
1736
1751
|
this.nonGroups = computed(() => {
|
|
1737
1752
|
return this.nodes().filter((n) => !isGroupNode(n));
|
|
1738
1753
|
});
|
|
1754
|
+
this.nodesPerFrame = computed(() => entitiesPerFrame(this.nodes().length, 10));
|
|
1755
|
+
this.groupsPerFrame = computed(() => entitiesPerFrame(this.groups().length, 10));
|
|
1756
|
+
this.nonGroupsPerFrame = computed(() => entitiesPerFrame(this.nonGroups().length, 10));
|
|
1739
1757
|
this.maxOrder = computed(() => {
|
|
1740
1758
|
return Math.max(...this.flowEntitiesService.nodes().map((n) => n.renderOrder()));
|
|
1741
1759
|
});
|
|
@@ -2134,6 +2152,7 @@ class EdgeRenderingService {
|
|
|
2134
2152
|
this.edges = computed(() => {
|
|
2135
2153
|
return this.flowEntitiesService.validEdges().sort((aNode, bNode) => aNode.renderOrder() - bNode.renderOrder());
|
|
2136
2154
|
});
|
|
2155
|
+
this.edgesPerFrame = computed(() => entitiesPerFrame(this.edges().length, 10));
|
|
2137
2156
|
this.maxOrder = computed(() => {
|
|
2138
2157
|
return Math.max(...this.flowEntitiesService.validEdges().map((n) => n.renderOrder()));
|
|
2139
2158
|
});
|
|
@@ -2269,14 +2288,14 @@ class EdgeComponent {
|
|
|
2269
2288
|
this.connectionController?.startReconnection(handle, this.model());
|
|
2270
2289
|
}
|
|
2271
2290
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EdgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2272
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EdgeComponent, isStandalone: true, selector: "g[edge]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, edgeTemplate: { classPropertyName: "edgeTemplate", publicName: "edgeTemplate", isSignal: true, isRequired: false, transformFunction: null }, edgeLabelHtmlTemplate: { classPropertyName: "edgeLabelHtmlTemplate", publicName: "edgeLabelHtmlTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.visibility": "isReconnecting() ? \"hidden\" : \"visible\"" }, classAttribute: "selectable" }, ngImport: i0, template: "@if (model().type === 'default') {\n <svg:path\n class=\"edge\"\n [attr.d]=\"model().path().path\"\n [attr.marker-start]=\"model().markerStartUrl()\"\n [attr.marker-end]=\"model().markerEndUrl()\"\n [class.edge_selected]=\"model().selected()\" />\n\n <svg:path class=\"interactive-edge\" [attr.d]=\"model().path().path\" (pointerStart)=\"select(); pull()\" />\n}\n\n@if (model().type === 'template' && edgeTemplate()) {\n @if (edgeTemplate(); as edgeTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"edgeTemplate\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n }\n}\n\n@if (model().edgeLabels.start; as label) {\n <svg:g
|
|
2291
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: EdgeComponent, isStandalone: true, selector: "g[edge]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, edgeTemplate: { classPropertyName: "edgeTemplate", publicName: "edgeTemplate", isSignal: true, isRequired: false, transformFunction: null }, edgeLabelHtmlTemplate: { classPropertyName: "edgeLabelHtmlTemplate", publicName: "edgeLabelHtmlTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.visibility": "isReconnecting() ? \"hidden\" : \"visible\"" }, classAttribute: "selectable" }, ngImport: i0, template: "@if (model().type === 'default') {\n <svg:path\n class=\"edge\"\n [attr.d]=\"model().path().path\"\n [attr.marker-start]=\"model().markerStartUrl()\"\n [attr.marker-end]=\"model().markerEndUrl()\"\n [class.edge_selected]=\"model().selected()\" />\n\n <svg:path class=\"interactive-edge\" [attr.d]=\"model().path().path\" (pointerStart)=\"select(); pull()\" />\n}\n\n@if (model().type === 'template' && edgeTemplate()) {\n @if (edgeTemplate(); as edgeTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"edgeTemplate\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n }\n}\n\n@if (model().edgeLabels.start; as label) {\n @if (model().path().labelPoints?.start; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().edgeLabels.center; as label) {\n @if (model().path().labelPoints?.center; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().edgeLabels.end; as label) {\n @if (model().path().labelPoints?.end; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().sourceHandle() && model().targetHandle()) {\n @if (model().reconnectable === true || model().reconnectable === 'source') {\n <svg:circle\n class=\"reconnect-handle\"\n r=\"10\"\n [attr.cx]=\"model().sourceHandle()!.pointAbsolute().x\"\n [attr.cy]=\"model().sourceHandle()!.pointAbsolute().y\"\n (pointerStart)=\"startReconnection($event, model().targetHandle()!)\" />\n }\n\n @if (model().reconnectable === true || model().reconnectable === 'target') {\n <svg:circle\n class=\"reconnect-handle\"\n r=\"10\"\n [attr.cx]=\"model().targetHandle()!.pointAbsolute().x\"\n [attr.cy]=\"model().targetHandle()!.pointAbsolute().y\"\n (pointerStart)=\"startReconnection($event, model().sourceHandle()!)\" />\n }\n}\n", styles: [".edge{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected{stroke-width:2.5;stroke:#0f4c75}.interactive-edge{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle{fill:transparent;cursor:move}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: EdgeLabelComponent, selector: "g[edgeLabel]", inputs: ["model", "edgeModel", "point", "htmlTemplate"] }, { kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2273
2292
|
}
|
|
2274
2293
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EdgeComponent, decorators: [{
|
|
2275
2294
|
type: Component,
|
|
2276
2295
|
args: [{ standalone: true, selector: 'g[edge]', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
2277
2296
|
class: 'selectable',
|
|
2278
2297
|
'[style.visibility]': 'isReconnecting() ? "hidden" : "visible"',
|
|
2279
|
-
}, imports: [NgTemplateOutlet, EdgeLabelComponent, PointerDirective], template: "@if (model().type === 'default') {\n <svg:path\n class=\"edge\"\n [attr.d]=\"model().path().path\"\n [attr.marker-start]=\"model().markerStartUrl()\"\n [attr.marker-end]=\"model().markerEndUrl()\"\n [class.edge_selected]=\"model().selected()\" />\n\n <svg:path class=\"interactive-edge\" [attr.d]=\"model().path().path\" (pointerStart)=\"select(); pull()\" />\n}\n\n@if (model().type === 'template' && edgeTemplate()) {\n @if (edgeTemplate(); as edgeTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"edgeTemplate\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n }\n}\n\n@if (model().edgeLabels.start; as label) {\n <svg:g
|
|
2298
|
+
}, imports: [NgTemplateOutlet, EdgeLabelComponent, PointerDirective], template: "@if (model().type === 'default') {\n <svg:path\n class=\"edge\"\n [attr.d]=\"model().path().path\"\n [attr.marker-start]=\"model().markerStartUrl()\"\n [attr.marker-end]=\"model().markerEndUrl()\"\n [class.edge_selected]=\"model().selected()\" />\n\n <svg:path class=\"interactive-edge\" [attr.d]=\"model().path().path\" (pointerStart)=\"select(); pull()\" />\n}\n\n@if (model().type === 'template' && edgeTemplate()) {\n @if (edgeTemplate(); as edgeTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"edgeTemplate\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n }\n}\n\n@if (model().edgeLabels.start; as label) {\n @if (model().path().labelPoints?.start; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().edgeLabels.center; as label) {\n @if (model().path().labelPoints?.center; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().edgeLabels.end; as label) {\n @if (model().path().labelPoints?.end; as point) {\n <svg:g edgeLabel [model]=\"label\" [point]=\"point\" [edgeModel]=\"model()\" [htmlTemplate]=\"edgeLabelHtmlTemplate()\" />\n }\n}\n\n@if (model().sourceHandle() && model().targetHandle()) {\n @if (model().reconnectable === true || model().reconnectable === 'source') {\n <svg:circle\n class=\"reconnect-handle\"\n r=\"10\"\n [attr.cx]=\"model().sourceHandle()!.pointAbsolute().x\"\n [attr.cy]=\"model().sourceHandle()!.pointAbsolute().y\"\n (pointerStart)=\"startReconnection($event, model().targetHandle()!)\" />\n }\n\n @if (model().reconnectable === true || model().reconnectable === 'target') {\n <svg:circle\n class=\"reconnect-handle\"\n r=\"10\"\n [attr.cx]=\"model().targetHandle()!.pointAbsolute().x\"\n [attr.cy]=\"model().targetHandle()!.pointAbsolute().y\"\n (pointerStart)=\"startReconnection($event, model().sourceHandle()!)\" />\n }\n}\n", styles: [".edge{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected{stroke-width:2.5;stroke:#0f4c75}.interactive-edge{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle{fill:transparent;cursor:move}\n"] }]
|
|
2280
2299
|
}] });
|
|
2281
2300
|
|
|
2282
2301
|
class HandleService {
|
|
@@ -2885,27 +2904,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
2885
2904
|
|
|
2886
2905
|
class ConnectionComponent {
|
|
2887
2906
|
constructor() {
|
|
2888
|
-
this.model = input.required();
|
|
2889
|
-
this.template = input();
|
|
2890
2907
|
this.flowStatusService = inject(FlowStatusService);
|
|
2891
2908
|
this.spacePointContext = inject(SpacePointContextDirective);
|
|
2909
|
+
this.flowEntitiesService = inject(FlowEntitiesService);
|
|
2910
|
+
this.model = input.required();
|
|
2911
|
+
this.template = input();
|
|
2892
2912
|
this.path = computed(() => {
|
|
2893
2913
|
const status = this.flowStatusService.status();
|
|
2914
|
+
const curve = this.model().curve;
|
|
2894
2915
|
if (status.state === 'connection-start' || status.state === 'reconnection-start') {
|
|
2895
2916
|
const sourceHandle = status.payload.sourceHandle;
|
|
2896
2917
|
const sourcePoint = sourceHandle.pointAbsolute();
|
|
2897
2918
|
const sourcePosition = sourceHandle.rawHandle.position;
|
|
2898
2919
|
const targetPoint = this.spacePointContext.svgCurrentSpacePoint();
|
|
2899
2920
|
const targetPosition = getOppositePostion(sourceHandle.rawHandle.position);
|
|
2900
|
-
|
|
2921
|
+
const params = this.getPathFactoryParams(sourcePoint, targetPoint, sourcePosition, targetPosition);
|
|
2922
|
+
switch (curve) {
|
|
2901
2923
|
case 'straight':
|
|
2902
|
-
return straightPath(
|
|
2924
|
+
return straightPath(params).path;
|
|
2903
2925
|
case 'bezier':
|
|
2904
|
-
return bezierPath(
|
|
2926
|
+
return bezierPath(params).path;
|
|
2905
2927
|
case 'smooth-step':
|
|
2906
|
-
return smoothStepPath(
|
|
2928
|
+
return smoothStepPath(params).path;
|
|
2907
2929
|
case 'step':
|
|
2908
|
-
return smoothStepPath(
|
|
2930
|
+
return smoothStepPath(params, 0).path;
|
|
2931
|
+
default:
|
|
2932
|
+
return curve(params).path;
|
|
2909
2933
|
}
|
|
2910
2934
|
}
|
|
2911
2935
|
if (status.state === 'connection-validation' || status.state === 'reconnection-validation') {
|
|
@@ -2920,15 +2944,18 @@ class ConnectionComponent {
|
|
|
2920
2944
|
const targetPosition = status.payload.valid
|
|
2921
2945
|
? targetHandle.rawHandle.position
|
|
2922
2946
|
: getOppositePostion(sourceHandle.rawHandle.position);
|
|
2923
|
-
|
|
2947
|
+
const params = this.getPathFactoryParams(sourcePoint, targetPoint, sourcePosition, targetPosition);
|
|
2948
|
+
switch (curve) {
|
|
2924
2949
|
case 'straight':
|
|
2925
|
-
return straightPath(
|
|
2950
|
+
return straightPath(params).path;
|
|
2926
2951
|
case 'bezier':
|
|
2927
|
-
return bezierPath(
|
|
2952
|
+
return bezierPath(params).path;
|
|
2928
2953
|
case 'smooth-step':
|
|
2929
|
-
return smoothStepPath(
|
|
2954
|
+
return smoothStepPath(params).path;
|
|
2930
2955
|
case 'step':
|
|
2931
|
-
return smoothStepPath(
|
|
2956
|
+
return smoothStepPath(params, 0).path;
|
|
2957
|
+
default:
|
|
2958
|
+
return curve(params).path;
|
|
2932
2959
|
}
|
|
2933
2960
|
}
|
|
2934
2961
|
return null;
|
|
@@ -2951,6 +2978,17 @@ class ConnectionComponent {
|
|
|
2951
2978
|
},
|
|
2952
2979
|
};
|
|
2953
2980
|
}
|
|
2981
|
+
getPathFactoryParams(sourcePoint, targetPoint, sourcePosition, targetPosition) {
|
|
2982
|
+
return {
|
|
2983
|
+
mode: 'connection',
|
|
2984
|
+
sourcePoint,
|
|
2985
|
+
targetPoint,
|
|
2986
|
+
sourcePosition,
|
|
2987
|
+
targetPosition,
|
|
2988
|
+
allEdges: this.flowEntitiesService.rawEdges(),
|
|
2989
|
+
allNodes: this.flowEntitiesService.rawNodes(),
|
|
2990
|
+
};
|
|
2991
|
+
}
|
|
2954
2992
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConnectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2955
2993
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ConnectionComponent, isStandalone: true, selector: "g[connection]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2956
2994
|
@if (model().type === 'default') {
|
|
@@ -3521,10 +3559,14 @@ class VflowComponent {
|
|
|
3521
3559
|
this.optimization = input({
|
|
3522
3560
|
detachedGroupsLayer: false,
|
|
3523
3561
|
});
|
|
3524
|
-
this.nodeModels =
|
|
3525
|
-
this.
|
|
3526
|
-
this.
|
|
3527
|
-
this.
|
|
3562
|
+
this.nodeModels = this.nodeRenderingService.nodes;
|
|
3563
|
+
this.nodesPerFrame = this.nodeRenderingService.nodesPerFrame;
|
|
3564
|
+
this.groups = this.nodeRenderingService.groups;
|
|
3565
|
+
this.groupsPerFrame = this.nodeRenderingService.groupsPerFrame;
|
|
3566
|
+
this.nonGroups = this.nodeRenderingService.nonGroups;
|
|
3567
|
+
this.nonGroupsPerFrame = this.nodeRenderingService.nonGroupsPerFrame;
|
|
3568
|
+
this.edgeModels = this.edgeRenderingService.edges;
|
|
3569
|
+
this.edgesPerFrame = this.edgeRenderingService.edgesPerFrame;
|
|
3528
3570
|
// #endregion
|
|
3529
3571
|
// #region OUTPUTS
|
|
3530
3572
|
/**
|
|
@@ -3785,7 +3827,7 @@ class VflowComponent {
|
|
|
3785
3827
|
ComponentEventBusService,
|
|
3786
3828
|
KeyboardService,
|
|
3787
3829
|
OverlaysService,
|
|
3788
|
-
], queries: [{ propertyName: "nodeTemplateDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true, isSignal: true }, { propertyName: "nodeSvgTemplateDirective", first: true, predicate: NodeSvgTemplateDirective, descendants: true, isSignal: true }, { propertyName: "groupNodeTemplateDirective", first: true, predicate: GroupNodeTemplateDirective, descendants: true, isSignal: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true, isSignal: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true, isSignal: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true, isSignal: true }, { propertyName: "spacePointContext", first: true, predicate: SpacePointContextDirective, descendants: true, isSignal: true }], hostDirectives: [{ directive: ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onNodesChange.position", "onNodesChange.position", "onNodesChange.position.single", "onNodesChange.position.single", "onNodesChange.position.many", "onNodesChange.position.many", "onNodesChange.size", "onNodesChange.size", "onNodesChange.size.single", "onNodesChange.size.single", "onNodesChange.size.many", "onNodesChange.size.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 #flow rootSvgRef rootSvgContext rootPointer flowSizeController class=\"root-svg\">\n <defs flowDefs [markers]=\"markers()\" />\n\n <g background />\n\n <svg:g mapContext spacePointContext>\n <!-- Connection -->\n <svg:g connection [model]=\"connection\" [template]=\"connectionTemplateDirective()?.templateRef\" />\n\n @if (optimization().detachedGroupsLayer) {\n <!-- Groups -->\n <svg:g\n *lazyFor=\"let model of groups(); trackBy: trackNodes\"\n node\n [model]=\"model\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n\n <!-- Edges -->\n <svg:g\n *lazyFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n\n <!-- Nodes -->\n <svg:g\n *lazyFor=\"let model of nonGroups(); trackBy: trackNodes\"\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n\n @if (!optimization().detachedGroupsLayer) {\n <!-- Edges -->\n <svg:g\n *lazyFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n\n <!-- Nodes -->\n <svg:g\n *lazyFor=\"let model of nodeModels(); trackBy: trackNodes\"\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n </svg:g>\n\n <!-- Minimap -->\n @if (minimap(); as minimap) {\n <ng-container [ngTemplateOutlet]=\"minimap.template()\" />\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: 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]" }, { kind: "component", type: DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "component", type: BackgroundComponent, selector: "g[background]" }, { kind: "directive", type: MapContextDirective, selector: "g[mapContext]" }, { kind: "directive", type: SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "component", type: ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: NodeComponent, selector: "g[node]", inputs: ["model", "nodeTemplate", "nodeSvgTemplate", "groupNodeTemplate"] }, { kind: "component", type: EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: LazyForDirective, selector: "[lazyFor][lazyForOf]", inputs: ["lazyForOf", "lazyForTrackBy", "lazyForItemsPerFrame", "lazyForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3830
|
+
], queries: [{ propertyName: "nodeTemplateDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true, isSignal: true }, { propertyName: "nodeSvgTemplateDirective", first: true, predicate: NodeSvgTemplateDirective, descendants: true, isSignal: true }, { propertyName: "groupNodeTemplateDirective", first: true, predicate: GroupNodeTemplateDirective, descendants: true, isSignal: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true, isSignal: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true, isSignal: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true, isSignal: true }, { propertyName: "spacePointContext", first: true, predicate: SpacePointContextDirective, descendants: true, isSignal: true }], hostDirectives: [{ directive: ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onNodesChange.position", "onNodesChange.position", "onNodesChange.position.single", "onNodesChange.position.single", "onNodesChange.position.many", "onNodesChange.position.many", "onNodesChange.size", "onNodesChange.size", "onNodesChange.size.single", "onNodesChange.size.single", "onNodesChange.size.many", "onNodesChange.size.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 #flow rootSvgRef rootSvgContext rootPointer flowSizeController class=\"root-svg\">\n <defs flowDefs [markers]=\"markers()\" />\n\n <g background />\n\n <svg:g mapContext spacePointContext>\n <!-- Connection -->\n <svg:g connection [model]=\"connection\" [template]=\"connectionTemplateDirective()?.templateRef\" />\n\n @if (optimization().detachedGroupsLayer) {\n <!-- Groups -->\n <svg:g\n *lazyFor=\"let model of groups(); trackBy: trackNodes; itemsPerFrame: groupsPerFrame()\"\n node\n [model]=\"model\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n\n <!-- Edges -->\n <svg:g\n *lazyFor=\"let model of edgeModels(); trackBy: trackEdges; itemsPerFrame: edgesPerFrame()\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n\n <!-- Nodes -->\n <svg:g\n *lazyFor=\"let model of nonGroups(); trackBy: trackNodes; itemsPerFrame: nonGroupsPerFrame()\"\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n\n @if (!optimization().detachedGroupsLayer) {\n <!-- Edges -->\n <svg:g\n *lazyFor=\"let model of edgeModels(); trackBy: trackEdges; itemsPerFrame: edgesPerFrame()\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n\n <!-- Nodes -->\n <svg:g\n *lazyFor=\"let model of nodeModels(); trackBy: trackNodes; itemsPerFrame: nodesPerFrame()\"\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n </svg:g>\n\n <!-- Minimap -->\n @if (minimap(); as minimap) {\n <ng-container [ngTemplateOutlet]=\"minimap.template()\" />\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: 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]" }, { kind: "component", type: DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "component", type: BackgroundComponent, selector: "g[background]" }, { kind: "directive", type: MapContextDirective, selector: "g[mapContext]" }, { kind: "directive", type: SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "component", type: ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: NodeComponent, selector: "g[node]", inputs: ["model", "nodeTemplate", "nodeSvgTemplate", "groupNodeTemplate"] }, { kind: "component", type: EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: LazyForDirective, selector: "[lazyFor][lazyForOf]", inputs: ["lazyForOf", "lazyForTrackBy", "lazyForItemsPerFrame", "lazyForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3789
3831
|
}
|
|
3790
3832
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VflowComponent, decorators: [{
|
|
3791
3833
|
type: Component,
|
|
@@ -3817,7 +3859,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
3817
3859
|
EdgeComponent,
|
|
3818
3860
|
NgTemplateOutlet,
|
|
3819
3861
|
LazyForDirective,
|
|
3820
|
-
], template: "<svg:svg #flow rootSvgRef rootSvgContext rootPointer flowSizeController class=\"root-svg\">\n <defs flowDefs [markers]=\"markers()\" />\n\n <g background />\n\n <svg:g mapContext spacePointContext>\n <!-- Connection -->\n <svg:g connection [model]=\"connection\" [template]=\"connectionTemplateDirective()?.templateRef\" />\n\n @if (optimization().detachedGroupsLayer) {\n <!-- Groups -->\n <svg:g\n *lazyFor=\"let model of groups(); trackBy: trackNodes\"\n node\n [model]=\"model\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n\n <!-- Edges -->\n <svg:g\n *lazyFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n\n <!-- Nodes -->\n <svg:g\n *lazyFor=\"let model of nonGroups(); trackBy: trackNodes\"\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n\n @if (!optimization().detachedGroupsLayer) {\n <!-- Edges -->\n <svg:g\n *lazyFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n\n <!-- Nodes -->\n <svg:g\n *lazyFor=\"let model of nodeModels(); trackBy: trackNodes\"\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n </svg:g>\n\n <!-- Minimap -->\n @if (minimap(); as minimap) {\n <ng-container [ngTemplateOutlet]=\"minimap.template()\" />\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"] }]
|
|
3862
|
+
], template: "<svg:svg #flow rootSvgRef rootSvgContext rootPointer flowSizeController class=\"root-svg\">\n <defs flowDefs [markers]=\"markers()\" />\n\n <g background />\n\n <svg:g mapContext spacePointContext>\n <!-- Connection -->\n <svg:g connection [model]=\"connection\" [template]=\"connectionTemplateDirective()?.templateRef\" />\n\n @if (optimization().detachedGroupsLayer) {\n <!-- Groups -->\n <svg:g\n *lazyFor=\"let model of groups(); trackBy: trackNodes; itemsPerFrame: groupsPerFrame()\"\n node\n [model]=\"model\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n\n <!-- Edges -->\n <svg:g\n *lazyFor=\"let model of edgeModels(); trackBy: trackEdges; itemsPerFrame: edgesPerFrame()\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n\n <!-- Nodes -->\n <svg:g\n *lazyFor=\"let model of nonGroups(); trackBy: trackNodes; itemsPerFrame: nonGroupsPerFrame()\"\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n\n @if (!optimization().detachedGroupsLayer) {\n <!-- Edges -->\n <svg:g\n *lazyFor=\"let model of edgeModels(); trackBy: trackEdges; itemsPerFrame: edgesPerFrame()\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n\n <!-- Nodes -->\n <svg:g\n *lazyFor=\"let model of nodeModels(); trackBy: trackNodes; itemsPerFrame: nodesPerFrame()\"\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n </svg:g>\n\n <!-- Minimap -->\n @if (minimap(); as minimap) {\n <ng-container [ngTemplateOutlet]=\"minimap.template()\" />\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"] }]
|
|
3821
3863
|
}], propDecorators: { view: [{
|
|
3822
3864
|
type: Input
|
|
3823
3865
|
}], minZoom: [{
|