ngx-vflow 1.13.2 → 1.14.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 +7 -1
- package/esm2022/lib/vflow/services/flow-rendering.service.mjs +33 -0
- package/esm2022/testing/component-mocks/vflow-mock.component.mjs +3 -1
- package/fesm2022/ngx-vflow-testing.mjs +2 -0
- package/fesm2022/ngx-vflow-testing.mjs.map +1 -1
- package/fesm2022/ngx-vflow.mjs +36 -0
- package/fesm2022/ngx-vflow.mjs.map +1 -1
- package/lib/vflow/components/vflow/vflow.component.d.ts +3 -0
- package/lib/vflow/services/flow-rendering.service.d.ts +7 -0
- package/package.json +1 -1
- package/testing/component-mocks/vflow-mock.component.d.ts +2 -0
package/fesm2022/ngx-vflow.mjs
CHANGED
|
@@ -3768,6 +3768,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
3768
3768
|
}]
|
|
3769
3769
|
}], ctorParameters: () => [] });
|
|
3770
3770
|
|
|
3771
|
+
class FlowRenderingService {
|
|
3772
|
+
constructor() {
|
|
3773
|
+
this.flowInitialized = signal(false);
|
|
3774
|
+
inject(NgZone).runOutsideAngular(async () => {
|
|
3775
|
+
await skipFrames(2);
|
|
3776
|
+
this.flowInitialized.set(true);
|
|
3777
|
+
});
|
|
3778
|
+
}
|
|
3779
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlowRenderingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3780
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlowRenderingService }); }
|
|
3781
|
+
}
|
|
3782
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlowRenderingService, decorators: [{
|
|
3783
|
+
type: Injectable
|
|
3784
|
+
}], ctorParameters: () => [] });
|
|
3785
|
+
// TODO may break on edge cases
|
|
3786
|
+
function skipFrames(count) {
|
|
3787
|
+
return new Promise((resolve) => {
|
|
3788
|
+
let frames = 0;
|
|
3789
|
+
function checkFrame() {
|
|
3790
|
+
frames++;
|
|
3791
|
+
if (frames < count) {
|
|
3792
|
+
requestAnimationFrame(checkFrame);
|
|
3793
|
+
}
|
|
3794
|
+
else {
|
|
3795
|
+
resolve();
|
|
3796
|
+
}
|
|
3797
|
+
}
|
|
3798
|
+
requestAnimationFrame(checkFrame);
|
|
3799
|
+
});
|
|
3800
|
+
}
|
|
3801
|
+
|
|
3771
3802
|
const changesControllerHostDirective = {
|
|
3772
3803
|
directive: ChangesControllerDirective,
|
|
3773
3804
|
outputs: [
|
|
@@ -3815,6 +3846,7 @@ class VflowComponent {
|
|
|
3815
3846
|
this.componentEventBusService = inject(ComponentEventBusService);
|
|
3816
3847
|
this.keyboardService = inject(KeyboardService);
|
|
3817
3848
|
this.injector = inject(Injector);
|
|
3849
|
+
this.flowRenderingService = inject(FlowRenderingService);
|
|
3818
3850
|
this.nodeModels = this.nodeRenderingService.nodes;
|
|
3819
3851
|
this.groups = this.nodeRenderingService.groups;
|
|
3820
3852
|
this.nonGroups = this.nodeRenderingService.nonGroups;
|
|
@@ -3857,6 +3889,7 @@ class VflowComponent {
|
|
|
3857
3889
|
this.edgesChange = toLazySignal(this.edgesChangeService.changes$, {
|
|
3858
3890
|
initialValue: [],
|
|
3859
3891
|
});
|
|
3892
|
+
this.initialized = this.flowRenderingService.flowInitialized.asReadonly();
|
|
3860
3893
|
// #endregion
|
|
3861
3894
|
// #region RX_API
|
|
3862
3895
|
/**
|
|
@@ -3871,6 +3904,7 @@ class VflowComponent {
|
|
|
3871
3904
|
* Observable with edges change
|
|
3872
3905
|
*/
|
|
3873
3906
|
this.edgesChange$ = this.edgesChangeService.changes$;
|
|
3907
|
+
this.initialized$ = toObservable(this.flowRenderingService.flowInitialized);
|
|
3874
3908
|
// #endregion
|
|
3875
3909
|
this.markers = this.flowEntitiesService.markers;
|
|
3876
3910
|
this.minimap = this.flowEntitiesService.minimap;
|
|
@@ -4089,6 +4123,7 @@ class VflowComponent {
|
|
|
4089
4123
|
KeyboardService,
|
|
4090
4124
|
OverlaysService,
|
|
4091
4125
|
{ provide: PreviewFlowRenderStrategyService, useClass: ViewportPreviewFlowRenderStrategyService },
|
|
4126
|
+
FlowRenderingService,
|
|
4092
4127
|
], 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 (flowOptimization().detachedGroupsLayer) {\n <!-- Groups -->\n @for (model of groups(); track trackNodes($index, model)) {\n <svg:g\n node\n [model]=\"model\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n <!-- Edges -->\n @for (model of edgeModels(); track trackEdges($index, model)) {\n <svg:g\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n }\n <!-- Nodes -->\n @for (model of nonGroups(); track trackNodes($index, model)) {\n <svg:g\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n }\n\n @if (!flowOptimization().detachedGroupsLayer) {\n <!-- Edges -->\n @for (model of edgeModels(); track trackEdges($index, model)) {\n <svg:g\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective()?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective()?.templateRef\" />\n }\n\n @for (model of nodeModels(); track trackNodes($index, model)) {\n <svg:g\n node\n [model]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective()?.templateRef\"\n [nodeSvgTemplate]=\"nodeSvgTemplateDirective()?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective()?.templateRef\"\n [attr.transform]=\"model.pointTransform()\" />\n }\n }\n </svg:g>\n\n <!-- Minimap -->\n @if (minimap(); as minimap) {\n <ng-container [ngTemplateOutlet]=\"minimap.template()\" />\n }\n</svg:svg>\n\n@if (flowOptimization().virtualization) {\n <canvas previewFlow class=\"preview-flow\" [width]=\"flowWidth()\" [height]=\"flowHeight()\"></canvas>\n}\n", styles: [":host{display:grid;grid-template-columns:1fr;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}.root-svg{grid-row-start:1;grid-column-start:1}.preview-flow{pointer-events:none;grid-row-start:1;grid-column-start:1}\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: "component", type: PreviewFlowComponent, selector: "canvas[previewFlow]", inputs: ["width", "height"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4093
4128
|
}
|
|
4094
4129
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VflowComponent, decorators: [{
|
|
@@ -4108,6 +4143,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
4108
4143
|
KeyboardService,
|
|
4109
4144
|
OverlaysService,
|
|
4110
4145
|
{ provide: PreviewFlowRenderStrategyService, useClass: ViewportPreviewFlowRenderStrategyService },
|
|
4146
|
+
FlowRenderingService,
|
|
4111
4147
|
], hostDirectives: [changesControllerHostDirective], imports: [
|
|
4112
4148
|
RootSvgReferenceDirective,
|
|
4113
4149
|
RootSvgContextDirective,
|