ngx-vflow 0.10.0 → 0.11.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/node/node.component.mjs +6 -4
- package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +29 -6
- package/esm2022/lib/vflow/directives/template.directive.mjs +12 -1
- package/esm2022/lib/vflow/interfaces/node.interface.mjs +13 -1
- package/esm2022/lib/vflow/interfaces/optimization.interface.mjs +2 -0
- package/esm2022/lib/vflow/models/handle.model.mjs +22 -9
- package/esm2022/lib/vflow/models/node.model.mjs +51 -14
- package/esm2022/lib/vflow/services/draggable.service.mjs +12 -3
- package/esm2022/lib/vflow/services/handle.service.mjs +7 -2
- package/esm2022/lib/vflow/services/node-rendering.service.mjs +12 -3
- package/esm2022/lib/vflow/vflow.module.mjs +5 -2
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/ngx-vflow.mjs +166 -45
- package/fesm2022/ngx-vflow.mjs.map +1 -1
- package/lib/vflow/components/node/node.component.d.ts +3 -2
- package/lib/vflow/components/vflow/vflow.component.d.ts +10 -5
- package/lib/vflow/directives/template.directive.d.ts +5 -0
- package/lib/vflow/interfaces/node.interface.d.ts +32 -2
- package/lib/vflow/interfaces/optimization.interface.d.ts +3 -0
- package/lib/vflow/models/handle.model.d.ts +2 -1
- package/lib/vflow/models/node.model.d.ts +9 -0
- package/lib/vflow/services/handle.service.d.ts +1 -1
- package/lib/vflow/services/node-rendering.service.d.ts +1 -0
- package/lib/vflow/vflow.module.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
package/fesm2022/ngx-vflow.mjs
CHANGED
|
@@ -420,10 +420,19 @@ class DraggableService {
|
|
|
420
420
|
deltaY = model.point().y - event.y;
|
|
421
421
|
})
|
|
422
422
|
.on('drag', (event) => {
|
|
423
|
-
|
|
423
|
+
let point = {
|
|
424
424
|
x: round(event.x + deltaX),
|
|
425
425
|
y: round(event.y + deltaY)
|
|
426
|
-
}
|
|
426
|
+
};
|
|
427
|
+
const parent = model.parent();
|
|
428
|
+
// keep node in bounds of parent
|
|
429
|
+
if (parent) {
|
|
430
|
+
point.x = Math.min(parent.size().width - model.size().width, point.x);
|
|
431
|
+
point.x = Math.max(0, point.x);
|
|
432
|
+
point.y = Math.min(parent.size().height - model.size().height, point.y);
|
|
433
|
+
point.y = Math.max(0, point.y);
|
|
434
|
+
}
|
|
435
|
+
model.setPoint(point);
|
|
427
436
|
});
|
|
428
437
|
}
|
|
429
438
|
/**
|
|
@@ -487,6 +496,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
487
496
|
type: Directive,
|
|
488
497
|
args: [{ selector: 'ng-template[nodeHtml]' }]
|
|
489
498
|
}] });
|
|
499
|
+
class GroupNodeTemplateDirective {
|
|
500
|
+
constructor() {
|
|
501
|
+
this.templateRef = inject(TemplateRef);
|
|
502
|
+
}
|
|
503
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GroupNodeTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
504
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: GroupNodeTemplateDirective, selector: "ng-template[groupNode]", ngImport: i0 }); }
|
|
505
|
+
}
|
|
506
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GroupNodeTemplateDirective, decorators: [{
|
|
507
|
+
type: Directive,
|
|
508
|
+
args: [{ selector: 'ng-template[groupNode]' }]
|
|
509
|
+
}] });
|
|
490
510
|
class HandleTemplateDirective {
|
|
491
511
|
constructor() {
|
|
492
512
|
this.templateRef = inject(TemplateRef);
|
|
@@ -811,13 +831,27 @@ function isDefaultStaticNode(node) {
|
|
|
811
831
|
function isDefaultDynamicNode(node) {
|
|
812
832
|
return node.type === 'default';
|
|
813
833
|
}
|
|
834
|
+
function isDefaultStaticGroupNode(node) {
|
|
835
|
+
return node.type === 'default-group';
|
|
836
|
+
}
|
|
837
|
+
function isDefaultDynamicGroupNode(node) {
|
|
838
|
+
return node.type === 'default-group';
|
|
839
|
+
}
|
|
840
|
+
function isTemplateStaticGroupNode(node) {
|
|
841
|
+
return node.type === 'template-group';
|
|
842
|
+
}
|
|
843
|
+
function isTemplateDynamicGroupNode(node) {
|
|
844
|
+
return node.type === 'template-group';
|
|
845
|
+
}
|
|
814
846
|
|
|
815
847
|
class NodeModel {
|
|
816
848
|
static { this.defaultWidth = 100; }
|
|
817
849
|
static { this.defaultHeight = 50; }
|
|
850
|
+
static { this.defaultColor = '#1b262c'; }
|
|
818
851
|
constructor(node) {
|
|
819
852
|
this.node = node;
|
|
820
853
|
this.flowSettingsService = inject(FlowSettingsService);
|
|
854
|
+
this.entitiesService = inject(FlowEntitiesService);
|
|
821
855
|
this.internalPoint = this.createInternalPointSignal();
|
|
822
856
|
this.throttledPoint$ = toObservable(this.internalPoint).pipe(observeOn(animationFrameScheduler));
|
|
823
857
|
this.point = toSignal(this.throttledPoint$, {
|
|
@@ -828,7 +862,18 @@ class NodeModel {
|
|
|
828
862
|
this.renderOrder = signal(0);
|
|
829
863
|
this.selected = signal(false);
|
|
830
864
|
this.selected$ = toObservable(this.selected);
|
|
831
|
-
this.
|
|
865
|
+
this.globalPoint = computed(() => {
|
|
866
|
+
let parent = this.parent();
|
|
867
|
+
let x = this.point().x;
|
|
868
|
+
let y = this.point().y;
|
|
869
|
+
while (parent !== null) {
|
|
870
|
+
x += parent.point().x;
|
|
871
|
+
y += parent.point().y;
|
|
872
|
+
parent = parent.parent();
|
|
873
|
+
}
|
|
874
|
+
return { x, y };
|
|
875
|
+
});
|
|
876
|
+
this.pointTransform = computed(() => `translate(${this.globalPoint().x}, ${this.globalPoint().y})`);
|
|
832
877
|
// Now source and handle positions derived from parent flow
|
|
833
878
|
this.sourcePosition = computed(() => this.flowSettingsService.handlePositions().source);
|
|
834
879
|
this.targetPosition = computed(() => this.flowSettingsService.handlePositions().target);
|
|
@@ -849,6 +894,9 @@ class NodeModel {
|
|
|
849
894
|
_selected: this.selected()
|
|
850
895
|
};
|
|
851
896
|
});
|
|
897
|
+
this.parent = computed(() => this.entitiesService.nodes().find(n => n.node.id === this.parentId()) ?? null);
|
|
898
|
+
this.color = signal(NodeModel.defaultColor);
|
|
899
|
+
this.parentId = signal(null);
|
|
852
900
|
if (isDefined(node.draggable)) {
|
|
853
901
|
if (isDynamicNode(node)) {
|
|
854
902
|
this.draggable = node.draggable;
|
|
@@ -857,6 +905,22 @@ class NodeModel {
|
|
|
857
905
|
this.draggable.set(node.draggable);
|
|
858
906
|
}
|
|
859
907
|
}
|
|
908
|
+
if (isDefined(node.parentId)) {
|
|
909
|
+
if (isDynamicNode(node)) {
|
|
910
|
+
this.parentId = node.parentId;
|
|
911
|
+
}
|
|
912
|
+
else {
|
|
913
|
+
this.parentId.set(node.parentId);
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
if (node.type === 'default-group' && node.color) {
|
|
917
|
+
if (isDynamicNode(node)) {
|
|
918
|
+
this.color = node.color;
|
|
919
|
+
}
|
|
920
|
+
else {
|
|
921
|
+
this.color.set(node.color);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
860
924
|
}
|
|
861
925
|
setPoint(point) {
|
|
862
926
|
this.internalPoint.set(point);
|
|
@@ -866,20 +930,24 @@ class NodeModel {
|
|
|
866
930
|
*/
|
|
867
931
|
linkDefaultNodeSizeWithModelSize() {
|
|
868
932
|
const node = this.node;
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
933
|
+
switch (node.type) {
|
|
934
|
+
case 'default':
|
|
935
|
+
case 'default-group':
|
|
936
|
+
case 'template-group': {
|
|
937
|
+
if (isDynamicNode(node)) {
|
|
938
|
+
effect(() => {
|
|
939
|
+
this.size.set({
|
|
940
|
+
width: node.width?.() ?? NodeModel.defaultWidth,
|
|
941
|
+
height: node.height?.() ?? NodeModel.defaultHeight,
|
|
942
|
+
});
|
|
943
|
+
}, { allowSignalWrites: true });
|
|
944
|
+
}
|
|
945
|
+
else {
|
|
872
946
|
this.size.set({
|
|
873
|
-
width: node.width
|
|
874
|
-
height: node.height
|
|
947
|
+
width: node.width ?? NodeModel.defaultWidth,
|
|
948
|
+
height: node.height ?? NodeModel.defaultHeight
|
|
875
949
|
});
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
else {
|
|
879
|
-
this.size.set({
|
|
880
|
-
width: node.width ?? NodeModel.defaultWidth,
|
|
881
|
-
height: node.height ?? NodeModel.defaultHeight
|
|
882
|
-
});
|
|
950
|
+
}
|
|
883
951
|
}
|
|
884
952
|
}
|
|
885
953
|
}
|
|
@@ -1349,10 +1417,19 @@ class NodeRenderingService {
|
|
|
1349
1417
|
return this.flowEntitiesService.nodes()
|
|
1350
1418
|
.sort((aNode, bNode) => aNode.renderOrder() - bNode.renderOrder());
|
|
1351
1419
|
});
|
|
1420
|
+
this.maxOrder = computed(() => {
|
|
1421
|
+
return Math.max(...this.flowEntitiesService.nodes().map((n) => n.renderOrder()));
|
|
1422
|
+
});
|
|
1352
1423
|
}
|
|
1353
1424
|
pullNode(node) {
|
|
1354
|
-
|
|
1355
|
-
|
|
1425
|
+
// TODO do not pull when the node is already on top
|
|
1426
|
+
// pull node
|
|
1427
|
+
node.renderOrder.set(this.maxOrder() + 1);
|
|
1428
|
+
// pull children
|
|
1429
|
+
this.flowEntitiesService
|
|
1430
|
+
.nodes()
|
|
1431
|
+
.filter(n => n.parent() === node)
|
|
1432
|
+
.forEach(n => this.pullNode(n));
|
|
1356
1433
|
}
|
|
1357
1434
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeRenderingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1358
1435
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeRenderingService }); }
|
|
@@ -1434,6 +1511,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1434
1511
|
args: [{ selector: 'g[spacePointContext]' }]
|
|
1435
1512
|
}] });
|
|
1436
1513
|
|
|
1514
|
+
function Microtask(target, key, descriptor) {
|
|
1515
|
+
const originalMethod = descriptor.value;
|
|
1516
|
+
descriptor.value = function (...args) {
|
|
1517
|
+
queueMicrotask(() => {
|
|
1518
|
+
originalMethod?.apply(this, args);
|
|
1519
|
+
});
|
|
1520
|
+
};
|
|
1521
|
+
// Return the modified descriptor
|
|
1522
|
+
return descriptor;
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1437
1525
|
class HandleService {
|
|
1438
1526
|
constructor() {
|
|
1439
1527
|
this.node = signal(null);
|
|
@@ -1453,9 +1541,12 @@ class HandleService {
|
|
|
1453
1541
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HandleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1454
1542
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HandleService }); }
|
|
1455
1543
|
}
|
|
1544
|
+
__decorate([
|
|
1545
|
+
Microtask // TODO fixes rendering of handle for group node
|
|
1546
|
+
], HandleService.prototype, "createHandle", null);
|
|
1456
1547
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HandleService, decorators: [{
|
|
1457
1548
|
type: Injectable
|
|
1458
|
-
}] });
|
|
1549
|
+
}], propDecorators: { createHandle: [] } });
|
|
1459
1550
|
|
|
1460
1551
|
function resizable(elems) {
|
|
1461
1552
|
return new Observable((subscriber) => {
|
|
@@ -1484,17 +1575,6 @@ const implementsWithInjector = (instance) => {
|
|
|
1484
1575
|
return 'injector' in instance && 'get' in instance.injector;
|
|
1485
1576
|
};
|
|
1486
1577
|
|
|
1487
|
-
function Microtask(target, key, descriptor) {
|
|
1488
|
-
const originalMethod = descriptor.value;
|
|
1489
|
-
descriptor.value = function (...args) {
|
|
1490
|
-
queueMicrotask(() => {
|
|
1491
|
-
originalMethod?.apply(this, args);
|
|
1492
|
-
});
|
|
1493
|
-
};
|
|
1494
|
-
// Return the modified descriptor
|
|
1495
|
-
return descriptor;
|
|
1496
|
-
}
|
|
1497
|
-
|
|
1498
1578
|
class HandleModel {
|
|
1499
1579
|
constructor(rawHandle, parentNode) {
|
|
1500
1580
|
this.rawHandle = rawHandle;
|
|
@@ -1538,21 +1618,22 @@ class HandleModel {
|
|
|
1538
1618
|
});
|
|
1539
1619
|
this.pointAbsolute = computed(() => {
|
|
1540
1620
|
return {
|
|
1541
|
-
x: this.parentNode.
|
|
1542
|
-
y: this.parentNode.
|
|
1621
|
+
x: this.parentNode.globalPoint().x + this.offset().x + this.sizeOffset().x,
|
|
1622
|
+
y: this.parentNode.globalPoint().y + this.offset().y + this.sizeOffset().y,
|
|
1543
1623
|
};
|
|
1544
1624
|
});
|
|
1545
1625
|
this.state = signal('idle');
|
|
1546
1626
|
this.updateParentSizeAndPosition$ = new Subject();
|
|
1547
|
-
this.parentSize = toSignal(this.updateParentSizeAndPosition$.pipe(map(() => ({
|
|
1548
|
-
width: this.parentReference.offsetWidth,
|
|
1549
|
-
height: this.parentReference.offsetHeight
|
|
1550
|
-
}))), {
|
|
1627
|
+
this.parentSize = toSignal(this.updateParentSizeAndPosition$.pipe(map(() => this.getParentSize())), {
|
|
1551
1628
|
initialValue: { width: 0, height: 0 }
|
|
1552
1629
|
});
|
|
1553
1630
|
this.parentPosition = toSignal(this.updateParentSizeAndPosition$.pipe(map(() => ({
|
|
1554
|
-
x: this.parentReference
|
|
1555
|
-
|
|
1631
|
+
x: this.parentReference instanceof HTMLElement
|
|
1632
|
+
? this.parentReference.offsetLeft
|
|
1633
|
+
: 0,
|
|
1634
|
+
y: this.parentReference instanceof HTMLElement
|
|
1635
|
+
? this.parentReference.offsetTop
|
|
1636
|
+
: 0 // for now just 0 for group nodes
|
|
1556
1637
|
}))), {
|
|
1557
1638
|
initialValue: { x: 0, y: 0 }
|
|
1558
1639
|
});
|
|
@@ -1568,6 +1649,18 @@ class HandleModel {
|
|
|
1568
1649
|
updateParent() {
|
|
1569
1650
|
this.updateParentSizeAndPosition$.next();
|
|
1570
1651
|
}
|
|
1652
|
+
getParentSize() {
|
|
1653
|
+
if (this.parentReference instanceof HTMLElement) {
|
|
1654
|
+
return {
|
|
1655
|
+
width: this.parentReference.offsetWidth,
|
|
1656
|
+
height: this.parentReference.offsetHeight
|
|
1657
|
+
};
|
|
1658
|
+
}
|
|
1659
|
+
else if (this.parentReference instanceof SVGGraphicsElement) {
|
|
1660
|
+
return this.parentReference.getBBox();
|
|
1661
|
+
}
|
|
1662
|
+
return { width: 0, height: 0 };
|
|
1663
|
+
}
|
|
1571
1664
|
}
|
|
1572
1665
|
|
|
1573
1666
|
class HandleComponent {
|
|
@@ -1796,7 +1889,7 @@ class NodeComponent {
|
|
|
1796
1889
|
}
|
|
1797
1890
|
}
|
|
1798
1891
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1799
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NodeComponent, selector: "g[node]", inputs: { nodeModel: "nodeModel",
|
|
1892
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NodeComponent, selector: "g[node]", inputs: { nodeModel: "nodeModel", nodeTemplate: "nodeTemplate", groupNodeTemplate: "groupNodeTemplate" }, providers: [HandleService], viewQueries: [{ propertyName: "nodeContentRef", first: true, predicate: ["nodeContent"], descendants: true }, { propertyName: "htmlWrapperRef", first: true, predicate: ["htmlWrapper"], descendants: true }], ngImport: i0, template: "<!-- Default node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n class=\"selectable\"\n #nodeContent\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode(); selectNode()\"\n>\n <div\n #htmlWrapper\n class=\"default-node\"\n [class.default-node_selected]=\"nodeModel.selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel.text()\"></div>\n\n <handle type=\"source\" [position]=\"nodeModel.sourcePosition()\" />\n <handle type=\"target\" [position]=\"nodeModel.targetPosition()\" />\n </div>\n</svg:foreignObject>\n\n<!-- Template node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' && nodeTemplate\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode()\"\n>\n <div #htmlWrapper class=\"wrapper\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Component node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.isComponentType\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode()\"\n>\n <div #htmlWrapper class=\"wrapper\">\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel.node.type)\"\n [ngComponentOutletInputs]=\"nodeModel.componentTypeInputs()\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Default group node -->\n<svg:rect\n *ngIf=\"nodeModel.node.type === 'default-group'\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel.selected()\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n [style.stroke]=\"nodeModel.color()\"\n [style.fill]=\"nodeModel.color()\"\n (mousedown)=\"pullNode(); selectNode()\"\n/>\n\n<svg:g\n *ngIf=\"nodeModel.node.type === 'template-group' && groupNodeTemplate\"\n class=\"selectable\"\n (mousedown)=\"pullNode()\"\n>\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n</svg:g>\n\n<!-- Handles -->\n<ng-container *ngFor=\"let handle of nodeModel.handles()\">\n <svg:circle\n *ngIf=\"!handle.template\"\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n\n <svg:g\n *ngIf=\"handle.template\"\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n\n <svg:circle\n *ngIf=\"showMagnet()\"\n class=\"magnet\"\n [attr.r]=\"nodeModel.magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n</ng-container>\n", styles: [".wrapper{width:max-content}.magnet{opacity:0}.default-node{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.default-node_selected{border-width:2px}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"], dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }, { kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1800
1893
|
}
|
|
1801
1894
|
__decorate([
|
|
1802
1895
|
InjectionContext
|
|
@@ -1808,10 +1901,12 @@ __decorate([
|
|
|
1808
1901
|
], NodeComponent.prototype, "ngAfterViewInit", null);
|
|
1809
1902
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeComponent, decorators: [{
|
|
1810
1903
|
type: Component,
|
|
1811
|
-
args: [{ selector: 'g[node]', changeDetection: ChangeDetectionStrategy.OnPush, providers: [HandleService], template: "<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n class=\"selectable\"\n #nodeContent\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode(); selectNode()\"\n>\n <div\n #htmlWrapper\n class=\"default-node\"\n [class.default-node_selected]=\"nodeModel.selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel.text()\"></div>\n\n <handle type=\"source\" [position]=\"nodeModel.sourcePosition()\" />\n <handle type=\"target\" [position]=\"nodeModel.targetPosition()\" />\n </div>\n</svg:foreignObject>\n\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' &&
|
|
1904
|
+
args: [{ selector: 'g[node]', changeDetection: ChangeDetectionStrategy.OnPush, providers: [HandleService], template: "<!-- Default node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n class=\"selectable\"\n #nodeContent\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode(); selectNode()\"\n>\n <div\n #htmlWrapper\n class=\"default-node\"\n [class.default-node_selected]=\"nodeModel.selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel.text()\"></div>\n\n <handle type=\"source\" [position]=\"nodeModel.sourcePosition()\" />\n <handle type=\"target\" [position]=\"nodeModel.targetPosition()\" />\n </div>\n</svg:foreignObject>\n\n<!-- Template node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' && nodeTemplate\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode()\"\n>\n <div #htmlWrapper class=\"wrapper\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Component node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.isComponentType\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode()\"\n>\n <div #htmlWrapper class=\"wrapper\">\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel.node.type)\"\n [ngComponentOutletInputs]=\"nodeModel.componentTypeInputs()\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Default group node -->\n<svg:rect\n *ngIf=\"nodeModel.node.type === 'default-group'\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel.selected()\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n [style.stroke]=\"nodeModel.color()\"\n [style.fill]=\"nodeModel.color()\"\n (mousedown)=\"pullNode(); selectNode()\"\n/>\n\n<svg:g\n *ngIf=\"nodeModel.node.type === 'template-group' && groupNodeTemplate\"\n class=\"selectable\"\n (mousedown)=\"pullNode()\"\n>\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n</svg:g>\n\n<!-- Handles -->\n<ng-container *ngFor=\"let handle of nodeModel.handles()\">\n <svg:circle\n *ngIf=\"!handle.template\"\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n\n <svg:g\n *ngIf=\"handle.template\"\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n\n <svg:circle\n *ngIf=\"showMagnet()\"\n class=\"magnet\"\n [attr.r]=\"nodeModel.magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n</ng-container>\n", styles: [".wrapper{width:max-content}.magnet{opacity:0}.default-node{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.default-node_selected{border-width:2px}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"] }]
|
|
1812
1905
|
}], propDecorators: { nodeModel: [{
|
|
1813
1906
|
type: Input
|
|
1814
|
-
}],
|
|
1907
|
+
}], nodeTemplate: [{
|
|
1908
|
+
type: Input
|
|
1909
|
+
}], groupNodeTemplate: [{
|
|
1815
1910
|
type: Input
|
|
1816
1911
|
}], nodeContentRef: [{
|
|
1817
1912
|
type: ViewChild,
|
|
@@ -2223,6 +2318,9 @@ class VflowComponent {
|
|
|
2223
2318
|
* Background for flow
|
|
2224
2319
|
*/
|
|
2225
2320
|
this.background = '#fff';
|
|
2321
|
+
this.optimization = {
|
|
2322
|
+
computeLayersOnInit: true
|
|
2323
|
+
};
|
|
2226
2324
|
this.nodeModels = computed(() => this.nodeRenderingService.nodes());
|
|
2227
2325
|
this.edgeModels = computed(() => this.flowEntitiesService.validEdges());
|
|
2228
2326
|
// #endregion
|
|
@@ -2333,6 +2431,9 @@ class VflowComponent {
|
|
|
2333
2431
|
addNodesToEdges(this.nodeModels(), newModels);
|
|
2334
2432
|
this.flowEntitiesService.edges.set(newModels);
|
|
2335
2433
|
}
|
|
2434
|
+
ngOnInit() {
|
|
2435
|
+
this.setInitialNodesOrder();
|
|
2436
|
+
}
|
|
2336
2437
|
// #region METHODS_API
|
|
2337
2438
|
/**
|
|
2338
2439
|
* Change viewport to specified state
|
|
@@ -2388,8 +2489,20 @@ class VflowComponent {
|
|
|
2388
2489
|
trackEdges(idx, { edge }) {
|
|
2389
2490
|
return edge;
|
|
2390
2491
|
}
|
|
2492
|
+
setInitialNodesOrder() {
|
|
2493
|
+
if (this.optimization.computeLayersOnInit) {
|
|
2494
|
+
this.nodeModels().forEach(model => {
|
|
2495
|
+
switch (model.node.type) {
|
|
2496
|
+
case 'default-group':
|
|
2497
|
+
case 'template-group': {
|
|
2498
|
+
this.nodeRenderingService.pullNode(model);
|
|
2499
|
+
}
|
|
2500
|
+
}
|
|
2501
|
+
});
|
|
2502
|
+
}
|
|
2503
|
+
}
|
|
2391
2504
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VflowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2392
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: VflowComponent, selector: "vflow", inputs: { view: "view", minZoom: "minZoom", maxZoom: "maxZoom", handlePositions: "handlePositions", background: "background", entitiesSelectable: "entitiesSelectable", connection: ["connection", "connection", (settings) => new ConnectionModel(settings)], nodes: "nodes", edges: "edges" }, outputs: { onComponentNodeEvent: "onComponentNodeEvent" }, providers: [
|
|
2505
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: VflowComponent, selector: "vflow", inputs: { view: "view", minZoom: "minZoom", maxZoom: "maxZoom", handlePositions: "handlePositions", background: "background", optimization: "optimization", entitiesSelectable: "entitiesSelectable", connection: ["connection", "connection", (settings) => new ConnectionModel(settings)], nodes: "nodes", edges: "edges" }, outputs: { onComponentNodeEvent: "onComponentNodeEvent" }, providers: [
|
|
2393
2506
|
DraggableService,
|
|
2394
2507
|
ViewportService,
|
|
2395
2508
|
FlowStatusService,
|
|
@@ -2400,7 +2513,7 @@ class VflowComponent {
|
|
|
2400
2513
|
SelectionService,
|
|
2401
2514
|
FlowSettingsService,
|
|
2402
2515
|
ComponentEventBusService
|
|
2403
|
-
], queries: [{ propertyName: "
|
|
2516
|
+
], queries: [{ propertyName: "nodeTemplateDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "groupNodeTemplateDirective", first: true, predicate: GroupNodeTemplateDirective, 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 [nodeTemplate]=\"nodeTemplateDirective?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective?.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", "nodeTemplate", "groupNodeTemplate"] }, { 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 }); }
|
|
2404
2517
|
}
|
|
2405
2518
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VflowComponent, decorators: [{
|
|
2406
2519
|
type: Component,
|
|
@@ -2418,7 +2531,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2418
2531
|
], hostDirectives: [
|
|
2419
2532
|
connectionControllerHostDirective,
|
|
2420
2533
|
changesControllerHostDirective
|
|
2421
|
-
], 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 [
|
|
2534
|
+
], 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 [nodeTemplate]=\"nodeTemplateDirective?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective?.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"] }]
|
|
2422
2535
|
}], propDecorators: { view: [{
|
|
2423
2536
|
type: Input
|
|
2424
2537
|
}], minZoom: [{
|
|
@@ -2429,6 +2542,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2429
2542
|
type: Input
|
|
2430
2543
|
}], background: [{
|
|
2431
2544
|
type: Input
|
|
2545
|
+
}], optimization: [{
|
|
2546
|
+
type: Input
|
|
2432
2547
|
}], entitiesSelectable: [{
|
|
2433
2548
|
type: Input
|
|
2434
2549
|
}], connection: [{
|
|
@@ -2441,9 +2556,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2441
2556
|
type: Input
|
|
2442
2557
|
}], onComponentNodeEvent: [{
|
|
2443
2558
|
type: Output
|
|
2444
|
-
}],
|
|
2559
|
+
}], nodeTemplateDirective: [{
|
|
2445
2560
|
type: ContentChild,
|
|
2446
2561
|
args: [NodeHtmlTemplateDirective]
|
|
2562
|
+
}], groupNodeTemplateDirective: [{
|
|
2563
|
+
type: ContentChild,
|
|
2564
|
+
args: [GroupNodeTemplateDirective]
|
|
2447
2565
|
}], edgeTemplateDirective: [{
|
|
2448
2566
|
type: ContentChild,
|
|
2449
2567
|
args: [EdgeTemplateDirective]
|
|
@@ -2517,6 +2635,7 @@ const directives = [
|
|
|
2517
2635
|
];
|
|
2518
2636
|
const templateDirectives = [
|
|
2519
2637
|
NodeHtmlTemplateDirective,
|
|
2638
|
+
GroupNodeTemplateDirective,
|
|
2520
2639
|
EdgeLabelHtmlTemplateDirective,
|
|
2521
2640
|
EdgeTemplateDirective,
|
|
2522
2641
|
ConnectionTemplateDirective,
|
|
@@ -2540,12 +2659,14 @@ class VflowModule {
|
|
|
2540
2659
|
PointerDirective,
|
|
2541
2660
|
RootPointerDirective,
|
|
2542
2661
|
FlowSizeControllerDirective, NodeHtmlTemplateDirective,
|
|
2662
|
+
GroupNodeTemplateDirective,
|
|
2543
2663
|
EdgeLabelHtmlTemplateDirective,
|
|
2544
2664
|
EdgeTemplateDirective,
|
|
2545
2665
|
ConnectionTemplateDirective,
|
|
2546
2666
|
HandleTemplateDirective], imports: [CommonModule], exports: [VflowComponent,
|
|
2547
2667
|
HandleComponent,
|
|
2548
2668
|
SelectableDirective, NodeHtmlTemplateDirective,
|
|
2669
|
+
GroupNodeTemplateDirective,
|
|
2549
2670
|
EdgeLabelHtmlTemplateDirective,
|
|
2550
2671
|
EdgeTemplateDirective,
|
|
2551
2672
|
ConnectionTemplateDirective,
|
|
@@ -2572,5 +2693,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2572
2693
|
* Generated bundle index. Do not edit.
|
|
2573
2694
|
*/
|
|
2574
2695
|
|
|
2575
|
-
export { ChangesControllerDirective, ConnectionControllerDirective, ConnectionTemplateDirective, CustomDynamicNodeComponent, CustomNodeComponent, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, HandleComponent, HandleTemplateDirective, NodeHtmlTemplateDirective, SelectableDirective, VflowComponent, VflowModule, isComponentDynamicNode, isComponentStaticNode, isDefaultDynamicNode, isDefaultStaticNode, isDynamicNode, isStaticNode, isTemplateDynamicNode, isTemplateStaticNode };
|
|
2696
|
+
export { ChangesControllerDirective, ConnectionControllerDirective, ConnectionTemplateDirective, CustomDynamicNodeComponent, CustomNodeComponent, EdgeLabelHtmlTemplateDirective, EdgeTemplateDirective, GroupNodeTemplateDirective, HandleComponent, HandleTemplateDirective, NodeHtmlTemplateDirective, SelectableDirective, VflowComponent, VflowModule, isComponentDynamicNode, isComponentStaticNode, isDefaultDynamicGroupNode, isDefaultDynamicNode, isDefaultStaticGroupNode, isDefaultStaticNode, isDynamicNode, isStaticNode, isTemplateDynamicGroupNode, isTemplateDynamicNode, isTemplateStaticGroupNode, isTemplateStaticNode };
|
|
2576
2697
|
//# sourceMappingURL=ngx-vflow.mjs.map
|