ngx-vflow 1.8.1 → 1.8.2
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 +5 -3
- package/esm2022/lib/vflow/directives/lazy-for.directive.mjs +243 -0
- package/fesm2022/ngx-vflow.mjs +244 -4
- package/fesm2022/ngx-vflow.mjs.map +1 -1
- package/lib/vflow/directives/lazy-for.directive.d.ts +94 -0
- package/package.json +1 -1
package/fesm2022/ngx-vflow.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, computed, Injectable, inject, ElementRef, Directive, effect, untracked, TemplateRef, DestroyRef, EventEmitter, OutputEmitterRef, input, NgZone, viewChild, Component, ChangeDetectionStrategy, output, HostListener, Injector, runInInjectionContext,
|
|
2
|
+
import { signal, computed, Injectable, inject, ElementRef, Directive, effect, untracked, TemplateRef, DestroyRef, EventEmitter, OutputEmitterRef, input, NgZone, viewChild, Component, ChangeDetectionStrategy, output, HostListener, Injector, runInInjectionContext, isDevMode, ViewContainerRef, IterableDiffers, ChangeDetectorRef, Input, contentChild, forwardRef } from '@angular/core';
|
|
3
3
|
import { select } from 'd3-selection';
|
|
4
4
|
import { zoomIdentity, zoom } from 'd3-zoom';
|
|
5
|
-
import { switchMap, merge, fromEvent, tap, Subject, Observable, skip, map, pairwise, filter, distinctUntilChanged, observeOn, asyncScheduler, zip, animationFrameScheduler, share, startWith, of } from 'rxjs';
|
|
5
|
+
import { switchMap, merge, fromEvent, tap, Subject, Observable, skip, map, pairwise, filter, distinctUntilChanged, observeOn, asyncScheduler, zip, animationFrameScheduler, share, startWith, from, bufferCount, concatMap, of, delayWhen, animationFrames, take, takeUntil, finalize } from 'rxjs';
|
|
6
6
|
import { toObservable, takeUntilDestroyed, outputFromObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
7
7
|
import { drag } from 'd3-drag';
|
|
8
8
|
import { __decorate } from 'tslib';
|
|
@@ -3232,6 +3232,245 @@ function getSpacePoints(point, groups) {
|
|
|
3232
3232
|
return result;
|
|
3233
3233
|
}
|
|
3234
3234
|
|
|
3235
|
+
/** Enum with lazy render directive state */
|
|
3236
|
+
var LazyForState;
|
|
3237
|
+
(function (LazyForState) {
|
|
3238
|
+
/** Directive is in idle state */
|
|
3239
|
+
LazyForState["idle"] = "idle";
|
|
3240
|
+
/** Directive is rendering */
|
|
3241
|
+
LazyForState["rendering"] = "rendering";
|
|
3242
|
+
})(LazyForState || (LazyForState = {}));
|
|
3243
|
+
/**
|
|
3244
|
+
* Context for an element in lazyFor
|
|
3245
|
+
*/
|
|
3246
|
+
class LazyForContextModel {
|
|
3247
|
+
/** Whether the element is first */
|
|
3248
|
+
get first() {
|
|
3249
|
+
return this.index === 0;
|
|
3250
|
+
}
|
|
3251
|
+
/** Whether the element is last */
|
|
3252
|
+
get last() {
|
|
3253
|
+
return this.index === this.count - 1;
|
|
3254
|
+
}
|
|
3255
|
+
/** Whether the element is even */
|
|
3256
|
+
get even() {
|
|
3257
|
+
return this.index % 2 === 0;
|
|
3258
|
+
}
|
|
3259
|
+
/** Whether the element is odd */
|
|
3260
|
+
get odd() {
|
|
3261
|
+
return !this.even;
|
|
3262
|
+
}
|
|
3263
|
+
constructor($implicit, lazyFor, index, count) {
|
|
3264
|
+
this.$implicit = $implicit;
|
|
3265
|
+
this.lazyFor = lazyFor;
|
|
3266
|
+
this.index = index;
|
|
3267
|
+
this.count = count;
|
|
3268
|
+
}
|
|
3269
|
+
}
|
|
3270
|
+
class LazyForDirective {
|
|
3271
|
+
/**
|
|
3272
|
+
* Asserts the correct type of the context for the template that `lazyFor` will render.
|
|
3273
|
+
*
|
|
3274
|
+
* The presence of this method is a signal to the Ivy template type-check compiler that the
|
|
3275
|
+
* `lazyFor` structural directive renders its template with a specific context type.
|
|
3276
|
+
*/
|
|
3277
|
+
static ngTemplateContextGuard(dir, ctx) {
|
|
3278
|
+
return true;
|
|
3279
|
+
}
|
|
3280
|
+
//#region INPUTS
|
|
3281
|
+
/** Setter for the array to be rendered by the directive */
|
|
3282
|
+
set lazyForOf(lazyFor) {
|
|
3283
|
+
this._lazyFor = lazyFor;
|
|
3284
|
+
this._lazyForDirty = true;
|
|
3285
|
+
}
|
|
3286
|
+
/**
|
|
3287
|
+
* Input - setter for TrackBy function
|
|
3288
|
+
* @description is required
|
|
3289
|
+
*/
|
|
3290
|
+
set lazyForTrackBy(fn) {
|
|
3291
|
+
if (isDevMode() && fn !== null && typeof fn !== 'function') {
|
|
3292
|
+
console.warn(`trackBy must be a function, but received ${JSON.stringify(fn)}. ` +
|
|
3293
|
+
`See https://angular.io/api/common/NgForOf#change-propagation for more information.`);
|
|
3294
|
+
}
|
|
3295
|
+
this._trackByFn = fn;
|
|
3296
|
+
}
|
|
3297
|
+
/**
|
|
3298
|
+
* Setter for the number of items that will be rendered per frame
|
|
3299
|
+
* @param value number of items that will be rendered per frame
|
|
3300
|
+
*/
|
|
3301
|
+
set lazyForItemsPerFrame(value) {
|
|
3302
|
+
if (value <= 0) {
|
|
3303
|
+
if (isDevMode()) {
|
|
3304
|
+
console.warn('Items per frame parameter cannot be lower than 0! Input value was ignored');
|
|
3305
|
+
}
|
|
3306
|
+
return;
|
|
3307
|
+
}
|
|
3308
|
+
this._itemsPerFrame = value;
|
|
3309
|
+
}
|
|
3310
|
+
/** Setter for array item template */
|
|
3311
|
+
set lazyForTemplate(value) {
|
|
3312
|
+
if (value) {
|
|
3313
|
+
this._template = value;
|
|
3314
|
+
}
|
|
3315
|
+
}
|
|
3316
|
+
/** Getter for TrackBy function */
|
|
3317
|
+
get lazyForTrackBy() {
|
|
3318
|
+
return this._trackByFn;
|
|
3319
|
+
}
|
|
3320
|
+
//#endregion
|
|
3321
|
+
constructor() {
|
|
3322
|
+
this._template = inject(TemplateRef);
|
|
3323
|
+
this._viewContainer = inject(ViewContainerRef);
|
|
3324
|
+
this._differs = inject(IterableDiffers);
|
|
3325
|
+
this._cdr = inject(ChangeDetectorRef);
|
|
3326
|
+
this._destroyRef$ = inject(DestroyRef);
|
|
3327
|
+
//#region PROPERTIES
|
|
3328
|
+
/** Array for rendering */
|
|
3329
|
+
this._lazyFor = null;
|
|
3330
|
+
/** lazyFor initialization flag */
|
|
3331
|
+
this._lazyForDirty = true;
|
|
3332
|
+
/** Differ for tracking changes in input array */
|
|
3333
|
+
this._differ = null;
|
|
3334
|
+
/** Number of items to be rendered per frame */
|
|
3335
|
+
this._itemsPerFrame = 5;
|
|
3336
|
+
/** Directive state */
|
|
3337
|
+
this._lazyForState = LazyForState.idle;
|
|
3338
|
+
//#endregion
|
|
3339
|
+
//#region RXJS
|
|
3340
|
+
/** Private subject for stopping dynamic render process */
|
|
3341
|
+
this._rerenderUnsub$ = new Subject();
|
|
3342
|
+
this._destroyRef$.onDestroy(() => this._viewContainer.clear());
|
|
3343
|
+
}
|
|
3344
|
+
/** ngDoCheck hook */
|
|
3345
|
+
ngDoCheck() {
|
|
3346
|
+
if (this._lazyForDirty) {
|
|
3347
|
+
this._lazyForDirty = false;
|
|
3348
|
+
const value = this._lazyFor;
|
|
3349
|
+
if (!this._differ && value) {
|
|
3350
|
+
this._differ = this._differs.find(value).create(this.lazyForTrackBy);
|
|
3351
|
+
}
|
|
3352
|
+
}
|
|
3353
|
+
if (this._differ) {
|
|
3354
|
+
let changes = this._differ.diff(this._lazyFor);
|
|
3355
|
+
if (changes) {
|
|
3356
|
+
if (this._lazyForState === LazyForState.rendering) {
|
|
3357
|
+
/**
|
|
3358
|
+
* If the array changed during an active render process
|
|
3359
|
+
* Need to clear container of all views
|
|
3360
|
+
* And restart rendering from the beginning.
|
|
3361
|
+
*/
|
|
3362
|
+
this._rerenderUnsub$.next();
|
|
3363
|
+
changes = this._differ.diff([]);
|
|
3364
|
+
changes = this._differ.diff(this._lazyFor);
|
|
3365
|
+
this._viewContainer.clear();
|
|
3366
|
+
if (changes) {
|
|
3367
|
+
this.applyChanges(changes);
|
|
3368
|
+
}
|
|
3369
|
+
}
|
|
3370
|
+
else {
|
|
3371
|
+
this.applyChanges(changes);
|
|
3372
|
+
}
|
|
3373
|
+
}
|
|
3374
|
+
}
|
|
3375
|
+
}
|
|
3376
|
+
/**
|
|
3377
|
+
* Apply changes detected by differ
|
|
3378
|
+
* @param changes changes
|
|
3379
|
+
*/
|
|
3380
|
+
applyChanges(changes) {
|
|
3381
|
+
const itemDataListToRender = [];
|
|
3382
|
+
changes.forEachOperation((item, adjustedPreviousIndex, currentIndex) => {
|
|
3383
|
+
const itemToPush = {
|
|
3384
|
+
item: { ...item },
|
|
3385
|
+
adjustedPreviousIndex,
|
|
3386
|
+
currentIndex,
|
|
3387
|
+
};
|
|
3388
|
+
itemDataListToRender.push(itemToPush);
|
|
3389
|
+
});
|
|
3390
|
+
this.performLazyRender(itemDataListToRender, changes);
|
|
3391
|
+
}
|
|
3392
|
+
/**
|
|
3393
|
+
* Perform lazy rendering
|
|
3394
|
+
* @param itemDataListToRender list of items to render
|
|
3395
|
+
* @param changes changes
|
|
3396
|
+
*/
|
|
3397
|
+
performLazyRender(itemDataListToRender, changes) {
|
|
3398
|
+
this.updateLazyForState(LazyForState.rendering);
|
|
3399
|
+
this._rerenderUnsub$.next();
|
|
3400
|
+
from(itemDataListToRender)
|
|
3401
|
+
.pipe(bufferCount(this._itemsPerFrame), concatMap((itemList) => of(itemList).pipe(delayWhen(() => animationFrames()))), tap((itemList) => {
|
|
3402
|
+
for (let i = 0; i < itemList.length; i++) {
|
|
3403
|
+
const data = itemList[i];
|
|
3404
|
+
if (data.item.previousIndex === null) {
|
|
3405
|
+
this._viewContainer.createEmbeddedView(this._template, new LazyForContextModel(data.item.item, this._lazyFor, -1, -1), data.currentIndex === null ? undefined : data.currentIndex);
|
|
3406
|
+
}
|
|
3407
|
+
else if (data.currentIndex === null) {
|
|
3408
|
+
this._viewContainer.remove(data.adjustedPreviousIndex === null ? undefined : data.adjustedPreviousIndex);
|
|
3409
|
+
}
|
|
3410
|
+
else if (data.adjustedPreviousIndex !== null) {
|
|
3411
|
+
const view = this._viewContainer.get(data.adjustedPreviousIndex);
|
|
3412
|
+
this._viewContainer.move(view, data.currentIndex);
|
|
3413
|
+
this.applyViewChange(view, data.item);
|
|
3414
|
+
}
|
|
3415
|
+
}
|
|
3416
|
+
this.updateViewContext();
|
|
3417
|
+
this._cdr.markForCheck();
|
|
3418
|
+
}),
|
|
3419
|
+
/** Using take we automatically unsubscribe from the stream when rendering is complete */
|
|
3420
|
+
take(Math.ceil(itemDataListToRender.length / this._itemsPerFrame)), takeUntil(this._rerenderUnsub$), takeUntilDestroyed(this._destroyRef$), finalize(() => {
|
|
3421
|
+
changes.forEachIdentityChange((record) => {
|
|
3422
|
+
const viewRef = (this._viewContainer.get(record.currentIndex));
|
|
3423
|
+
this.applyViewChange(viewRef, record);
|
|
3424
|
+
});
|
|
3425
|
+
this.updateLazyForState(LazyForState.idle);
|
|
3426
|
+
}))
|
|
3427
|
+
.subscribe();
|
|
3428
|
+
}
|
|
3429
|
+
/** Update context (without implicit$) for elements inside view */
|
|
3430
|
+
updateViewContext() {
|
|
3431
|
+
for (let i = 0, ilen = this._viewContainer.length; i < ilen; i++) {
|
|
3432
|
+
const viewRef = (this._viewContainer.get(i));
|
|
3433
|
+
const context = viewRef.context;
|
|
3434
|
+
context.index = i;
|
|
3435
|
+
context.count = ilen;
|
|
3436
|
+
context.lazyFor = this._lazyFor;
|
|
3437
|
+
}
|
|
3438
|
+
}
|
|
3439
|
+
/**
|
|
3440
|
+
* Apply implicit$ context
|
|
3441
|
+
* @param view view
|
|
3442
|
+
* @param record data
|
|
3443
|
+
*/
|
|
3444
|
+
applyViewChange(view, record) {
|
|
3445
|
+
view.context.$implicit = record.item;
|
|
3446
|
+
}
|
|
3447
|
+
/**
|
|
3448
|
+
* Update directive state
|
|
3449
|
+
* @param stateToSet state to set
|
|
3450
|
+
*/
|
|
3451
|
+
updateLazyForState(stateToSet) {
|
|
3452
|
+
this._lazyForState = stateToSet;
|
|
3453
|
+
}
|
|
3454
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LazyForDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
3455
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: LazyForDirective, isStandalone: true, selector: "[lazyFor][lazyForOf]", inputs: { lazyForOf: "lazyForOf", lazyForTrackBy: "lazyForTrackBy", lazyForItemsPerFrame: "lazyForItemsPerFrame", lazyForTemplate: "lazyForTemplate" }, ngImport: i0 }); }
|
|
3456
|
+
}
|
|
3457
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LazyForDirective, decorators: [{
|
|
3458
|
+
type: Directive,
|
|
3459
|
+
args: [{
|
|
3460
|
+
selector: '[lazyFor][lazyForOf]',
|
|
3461
|
+
standalone: true,
|
|
3462
|
+
}]
|
|
3463
|
+
}], ctorParameters: () => [], propDecorators: { lazyForOf: [{
|
|
3464
|
+
type: Input
|
|
3465
|
+
}], lazyForTrackBy: [{
|
|
3466
|
+
type: Input,
|
|
3467
|
+
args: [{ required: true }]
|
|
3468
|
+
}], lazyForItemsPerFrame: [{
|
|
3469
|
+
type: Input
|
|
3470
|
+
}], lazyForTemplate: [{
|
|
3471
|
+
type: Input
|
|
3472
|
+
}] } });
|
|
3473
|
+
|
|
3235
3474
|
const changesControllerHostDirective = {
|
|
3236
3475
|
directive: ChangesControllerDirective,
|
|
3237
3476
|
outputs: [
|
|
@@ -3546,7 +3785,7 @@ class VflowComponent {
|
|
|
3546
3785
|
ComponentEventBusService,
|
|
3547
3786
|
KeyboardService,
|
|
3548
3787
|
OverlaysService,
|
|
3549
|
-
], 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
|
|
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 }); }
|
|
3550
3789
|
}
|
|
3551
3790
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: VflowComponent, decorators: [{
|
|
3552
3791
|
type: Component,
|
|
@@ -3577,7 +3816,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
3577
3816
|
NodeComponent,
|
|
3578
3817
|
EdgeComponent,
|
|
3579
3818
|
NgTemplateOutlet,
|
|
3580
|
-
|
|
3819
|
+
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"] }]
|
|
3581
3821
|
}], propDecorators: { view: [{
|
|
3582
3822
|
type: Input
|
|
3583
3823
|
}], minZoom: [{
|