ng-virtual-list 0.6.0 → 0.7.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/README.md +89 -11
- package/fesm2022/ng-virtual-list.mjs +162 -116
- package/fesm2022/ng-virtual-list.mjs.map +1 -1
- package/lib/components/ng-virtual-list-item.component.d.ts +1 -0
- package/lib/const/index.d.ts +21 -0
- package/lib/utils/debounce.d.ts +10 -0
- package/lib/utils/index.d.ts +2 -1
- package/lib/utils/trackBox.d.ts +7 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -263,11 +263,7 @@ Template
|
|
|
263
263
|
|
|
264
264
|
Component
|
|
265
265
|
```ts
|
|
266
|
-
import {
|
|
267
|
-
import { NgVirtualListComponent } from '../../projects/ng-virtual-list/src/public-api';
|
|
268
|
-
import { IVirtualListCollection } from '../../projects/ng-virtual-list/src/lib/models';
|
|
269
|
-
import { FormsModule } from '@angular/forms';
|
|
270
|
-
import { Id } from '../../projects/ng-virtual-list/src/lib/types';
|
|
266
|
+
import { NgVirtualListComponent, IVirtualListCollection, Id } from 'ng-virtual-list';
|
|
271
267
|
|
|
272
268
|
const MAX_ITEMS = 1000000;
|
|
273
269
|
|
|
@@ -299,6 +295,87 @@ export class AppComponent {
|
|
|
299
295
|
|
|
300
296
|
```
|
|
301
297
|
|
|
298
|
+
### Virtual list (with dynamic item size)
|
|
299
|
+
|
|
300
|
+
Virtual list with height-adjustable elements.
|
|
301
|
+
|
|
302
|
+

|
|
303
|
+
|
|
304
|
+
Template
|
|
305
|
+
```html
|
|
306
|
+
<ng-virtual-list #dynamicList class="list" [items]="groupDynamicItems" [itemRenderer]="groupItemRenderer" [itemsOffset]="10"
|
|
307
|
+
[stickyMap]="groupDynamicItemsStickyMap" [dynamicSize]="true" [snap]="true"></ng-virtual-list>
|
|
308
|
+
|
|
309
|
+
<ng-template #groupItemRenderer let-data="data">
|
|
310
|
+
@if (data) {
|
|
311
|
+
@switch (data.type) {
|
|
312
|
+
@case ("group-header") {
|
|
313
|
+
<div class="list__group-container">
|
|
314
|
+
<span>{{data.name}}</span>
|
|
315
|
+
</div>
|
|
316
|
+
}
|
|
317
|
+
@default {
|
|
318
|
+
<div class="list__container">
|
|
319
|
+
<span>{{data.name}}</span>
|
|
320
|
+
</div>
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
</ng-template>
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Component
|
|
328
|
+
```ts
|
|
329
|
+
import { NgVirtualListComponent, IVirtualListCollection } from 'ng-virtual-list';
|
|
330
|
+
|
|
331
|
+
const CHARS = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
|
|
332
|
+
|
|
333
|
+
const generateLetter = () => {
|
|
334
|
+
return CHARS[Math.round(Math.random() * CHARS.length)];
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const generateWord = () => {
|
|
338
|
+
const length = 5 + Math.floor(Math.random() * 50), result = [];
|
|
339
|
+
while (result.length < length) {
|
|
340
|
+
result.push(generateLetter());
|
|
341
|
+
}
|
|
342
|
+
return `${result.join('')}`;
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
const generateText = () => {
|
|
346
|
+
const length = 2 + Math.floor(Math.random() * 10), result = [];
|
|
347
|
+
while (result.length < length) {
|
|
348
|
+
result.push(generateWord());
|
|
349
|
+
}
|
|
350
|
+
result[0] = result[0].toUpperCase();
|
|
351
|
+
return `${result.join(' ')}.`;
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
const GROUP_DYNAMIC_ITEMS: IVirtualListCollection = [],
|
|
355
|
+
GROUP_DYNAMIC_ITEMS_STICKY_MAP: IVirtualListStickyMap = {};
|
|
356
|
+
|
|
357
|
+
let groupDynamicIndex = 0;
|
|
358
|
+
for (let i = 0, l = 100000; i < l; i++) {
|
|
359
|
+
const id = i + 1, type = i === 0 || Math.random() > .895 ? 'group-header' : 'item';
|
|
360
|
+
if (type === 'group-header') {
|
|
361
|
+
groupDynamicIndex++;
|
|
362
|
+
}
|
|
363
|
+
GROUP_DYNAMIC_ITEMS.push({ id, type, name: type === 'group-header' ? `Group ${groupDynamicIndex}` : `${id}. ${generateText()}` });
|
|
364
|
+
GROUP_DYNAMIC_ITEMS_STICKY_MAP[id] = type === 'group-header' ? 1 : 0;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
@Component({
|
|
368
|
+
selector: 'app-root',
|
|
369
|
+
imports: [FormsModule, NgVirtualListComponent],
|
|
370
|
+
templateUrl: './app.component.html',
|
|
371
|
+
styleUrl: './app.component.scss'
|
|
372
|
+
})
|
|
373
|
+
export class AppComponent {
|
|
374
|
+
groupDynamicItems = GROUP_DYNAMIC_ITEMS;
|
|
375
|
+
groupDynamicItemsStickyMap = GROUP_DYNAMIC_ITEMS_STICKY_MAP;
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
302
379
|
## Stylization
|
|
303
380
|
|
|
304
381
|
List items are encapsulated in shadowDOM, so to override default styles you need to use ::part access
|
|
@@ -363,13 +440,14 @@ Inputs
|
|
|
363
440
|
|---|---|---|
|
|
364
441
|
| id | number | Readonly. Returns the unique identifier of the component. |
|
|
365
442
|
| items | [IVirtualListCollection](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/models/collection.model.ts) | Collection of list items. |
|
|
366
|
-
| itemSize | number | If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element. Ignored if the dynamicSize property is true. |
|
|
367
|
-
| itemsOffset | number? | Number of elements outside the scope of visibility. Default value is 2. |
|
|
443
|
+
| itemSize | number? = 24 | If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element. Ignored if the dynamicSize property is true. |
|
|
444
|
+
| itemsOffset | number? = 2 | Number of elements outside the scope of visibility. Default value is 2. |
|
|
368
445
|
| itemRenderer | TemplateRef | Rendering element template. |
|
|
369
446
|
| stickyMap | [IVirtualListStickyMap?](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/models/sticky-map.model.ts) | Dictionary zIndex by id of the list element. If the value is not set or equal to 0, then a simple element is displayed, if the value is greater than 0, then the sticky position mode is enabled for the element. |
|
|
370
|
-
| snap | boolean? | Determines whether elements will snap. Default value is "false". |
|
|
371
|
-
| snapToItem | boolean? | Determines whether scroll positions will be snapped to the element. Default value is "false". |
|
|
372
|
-
| direction | [Direction](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/enums/direction.ts) | Determines the direction in which elements are placed. Default value is "vertical". |
|
|
447
|
+
| snap | boolean? = false | Determines whether elements will snap. Default value is "false". |
|
|
448
|
+
| snapToItem | boolean? = false | Determines whether scroll positions will be snapped to the element. Default value is "false". |
|
|
449
|
+
| direction | [Direction? = 'vertical'](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/enums/direction.ts) | Determines the direction in which elements are placed. Default value is "vertical". |
|
|
450
|
+
| dynamicSize | boolean? = false | If true then the items in the list can have different sizes and the itemSize property is ignored. If false then the items in the list have a fixed size specified by the itemSize property. The default value is false. |
|
|
373
451
|
|
|
374
452
|
<br/>
|
|
375
453
|
|
|
@@ -386,4 +464,4 @@ Methods
|
|
|
386
464
|
|
|
387
465
|
| Method | Type | Description |
|
|
388
466
|
|--|--|--|
|
|
389
|
-
| scrollTo | (id: [Id](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/types/id.ts), behavior: ScrollBehavior = 'auto') => number | The method scrolls the list to the element with the given id and returns the value of the scrolled area. Behavior accepts the values "auto", "instant" and "smooth". |
|
|
467
|
+
| scrollTo | (id: [Id](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/types/id.ts), behavior: ScrollBehavior = 'auto') => number | The method scrolls the list to the element with the given id and returns the value of the scrolled area. Behavior accepts the values "auto", "instant" and "smooth". |
|
|
@@ -5,6 +5,44 @@ import { CommonModule } from '@angular/common';
|
|
|
5
5
|
import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
6
|
import { BehaviorSubject, filter, map, tap, combineLatest, distinctUntilChanged, switchMap, of } from 'rxjs';
|
|
7
7
|
|
|
8
|
+
var Directions;
|
|
9
|
+
(function (Directions) {
|
|
10
|
+
Directions["HORIZONTAL"] = "horizontal";
|
|
11
|
+
Directions["VERTICAL"] = "vertical";
|
|
12
|
+
})(Directions || (Directions = {}));
|
|
13
|
+
|
|
14
|
+
const DEFAULT_ITEM_SIZE = 24;
|
|
15
|
+
const DEFAULT_ITEMS_OFFSET = 2;
|
|
16
|
+
const DEFAULT_LIST_SIZE = 400;
|
|
17
|
+
const DEFAULT_SNAP = false;
|
|
18
|
+
const DEFAULT_SNAP_TO_ITEM = false;
|
|
19
|
+
const DEFAULT_DYNAMIC_SIZE = false;
|
|
20
|
+
const TRACK_BY_PROPERTY_NAME = 'id';
|
|
21
|
+
const DEFAULT_DIRECTION = Directions.VERTICAL;
|
|
22
|
+
const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;
|
|
23
|
+
// presets
|
|
24
|
+
const BEHAVIOR_INSTANT = 'instant';
|
|
25
|
+
const BEHAVIOR_AUTO = 'auto';
|
|
26
|
+
const VISIBILITY_VISIBLE = 'visible';
|
|
27
|
+
const VISIBILITY_HIDDEN = 'hidden';
|
|
28
|
+
const SIZE_100_PERSENT = '100%';
|
|
29
|
+
const SIZE_AUTO = 'auto';
|
|
30
|
+
const POSITION_ABSOLUTE = 'absolute';
|
|
31
|
+
const POSITION_STICKY = 'sticky';
|
|
32
|
+
const TRANSLATE_3D = 'translate3d';
|
|
33
|
+
const ZEROS_TRANSLATE_3D = `${TRANSLATE_3D}(0,0,0)`;
|
|
34
|
+
const TOP_PROP_NAME = 'top';
|
|
35
|
+
const LEFT_PROP_NAME = 'left';
|
|
36
|
+
const X_PROP_NAME = 'x';
|
|
37
|
+
const Y_PROP_NAME = 'y';
|
|
38
|
+
const WIDTH_PROP_NAME = 'width';
|
|
39
|
+
const HEIGHT_PROP_NAME = 'height';
|
|
40
|
+
const PX = 'px';
|
|
41
|
+
const SCROLL = 'scroll';
|
|
42
|
+
const SCROLL_END = 'scrollend';
|
|
43
|
+
const CLASS_LIST_VERTICAL = 'vertical';
|
|
44
|
+
const CLASS_LIST_HORIZONTAL = 'horizontal';
|
|
45
|
+
|
|
8
46
|
/**
|
|
9
47
|
* Virtual list item component
|
|
10
48
|
* @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list
|
|
@@ -28,18 +66,21 @@ class NgVirtualListItemComponent {
|
|
|
28
66
|
const styles = this._elementRef.nativeElement.style;
|
|
29
67
|
styles.zIndex = data.config.sticky;
|
|
30
68
|
if (data.config.snapped) {
|
|
31
|
-
styles.transform =
|
|
32
|
-
styles.position =
|
|
69
|
+
styles.transform = ZEROS_TRANSLATE_3D;
|
|
70
|
+
styles.position = POSITION_STICKY;
|
|
33
71
|
}
|
|
34
72
|
else {
|
|
35
|
-
styles.position =
|
|
36
|
-
styles.transform =
|
|
73
|
+
styles.position = POSITION_ABSOLUTE;
|
|
74
|
+
styles.transform = `${TRANSLATE_3D}(${data.config.isVertical ? 0 : data.measures.x}${PX}, ${data.config.isVertical ? data.measures.y : 0}${PX} , 0)`;
|
|
37
75
|
}
|
|
38
|
-
styles.height = data.config.isVertical ? data.config.dynamic ?
|
|
39
|
-
styles.width = data.config.isVertical ?
|
|
76
|
+
styles.height = data.config.isVertical ? data.config.dynamic ? SIZE_AUTO : `${data.measures.height}${PX}` : SIZE_100_PERSENT;
|
|
77
|
+
styles.width = data.config.isVertical ? SIZE_100_PERSENT : data.config.dynamic ? SIZE_AUTO : `${data.measures.width}${PX}`;
|
|
40
78
|
}
|
|
41
79
|
this.data.set(v);
|
|
42
80
|
}
|
|
81
|
+
get itemId() {
|
|
82
|
+
return this._data?.id;
|
|
83
|
+
}
|
|
43
84
|
itemRenderer = signal(undefined);
|
|
44
85
|
set renderer(v) {
|
|
45
86
|
this.itemRenderer.set(v);
|
|
@@ -55,17 +96,17 @@ class NgVirtualListItemComponent {
|
|
|
55
96
|
}
|
|
56
97
|
showIfNeed() {
|
|
57
98
|
const styles = this._elementRef.nativeElement.style;
|
|
58
|
-
if (styles.visibility ===
|
|
99
|
+
if (styles.visibility === VISIBILITY_VISIBLE) {
|
|
59
100
|
return;
|
|
60
101
|
}
|
|
61
|
-
styles.visibility =
|
|
102
|
+
styles.visibility = VISIBILITY_VISIBLE;
|
|
62
103
|
}
|
|
63
104
|
hide() {
|
|
64
105
|
const styles = this._elementRef.nativeElement.style;
|
|
65
|
-
if (styles.visibility ===
|
|
106
|
+
if (styles.visibility === VISIBILITY_HIDDEN) {
|
|
66
107
|
return;
|
|
67
108
|
}
|
|
68
|
-
styles.visibility =
|
|
109
|
+
styles.visibility = VISIBILITY_HIDDEN;
|
|
69
110
|
}
|
|
70
111
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
71
112
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: NgVirtualListItemComponent, isStandalone: true, selector: "ng-virtual-list-item", host: { classAttribute: "ngvl__item" }, ngImport: i0, template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem part=\"item\" class=\"ngvl-item__container\">\r\n @if (renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\" [ngTemplateOutletContext]=\"{data: item.data || {}}\" />\r\n }\r\n</li>\r\n}", styles: [":host{display:block;position:absolute;left:0;top:0;box-sizing:border-box;overflow:hidden}.ngvl-item__container{margin:0;padding:0;overflow:hidden;background-color:#fff;width:inherit;height:inherit}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
@@ -77,22 +118,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
77
118
|
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem part=\"item\" class=\"ngvl-item__container\">\r\n @if (renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\" [ngTemplateOutletContext]=\"{data: item.data || {}}\" />\r\n }\r\n</li>\r\n}", styles: [":host{display:block;position:absolute;left:0;top:0;box-sizing:border-box;overflow:hidden}.ngvl-item__container{margin:0;padding:0;overflow:hidden;background-color:#fff;width:inherit;height:inherit}\n"] }]
|
|
78
119
|
}], ctorParameters: () => [] });
|
|
79
120
|
|
|
80
|
-
var Directions;
|
|
81
|
-
(function (Directions) {
|
|
82
|
-
Directions["HORIZONTAL"] = "horizontal";
|
|
83
|
-
Directions["VERTICAL"] = "vertical";
|
|
84
|
-
})(Directions || (Directions = {}));
|
|
85
|
-
|
|
86
|
-
const DEFAULT_ITEM_SIZE = 24;
|
|
87
|
-
const DEFAULT_ITEMS_OFFSET = 2;
|
|
88
|
-
const DEFAULT_LIST_SIZE = 400;
|
|
89
|
-
const DEFAULT_SNAP = false;
|
|
90
|
-
const DEFAULT_SNAP_TO_ITEM = false;
|
|
91
|
-
const DEFAULT_DYNAMIC_SIZE = false;
|
|
92
|
-
const TRACK_BY_PROPERTY_NAME = 'id';
|
|
93
|
-
const DEFAULT_DIRECTION = Directions.VERTICAL;
|
|
94
|
-
const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;
|
|
95
|
-
|
|
96
121
|
const HORIZONTAL_ALIASES = [Directions.HORIZONTAL, 'horizontal'], VERTICAL_ALIASES = [Directions.VERTICAL, 'vertical'];
|
|
97
122
|
const isDirection = (src, expected) => {
|
|
98
123
|
if (HORIZONTAL_ALIASES.includes(expected)) {
|
|
@@ -101,6 +126,31 @@ const isDirection = (src, expected) => {
|
|
|
101
126
|
return VERTICAL_ALIASES.includes(src);
|
|
102
127
|
};
|
|
103
128
|
|
|
129
|
+
/**
|
|
130
|
+
* Simple debounce function.
|
|
131
|
+
* @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list
|
|
132
|
+
* @author Evgenii Grebennikov
|
|
133
|
+
* @email djonnyx@gmail.com
|
|
134
|
+
*/
|
|
135
|
+
const debounce = (cb, debounceTime = 0) => {
|
|
136
|
+
let timeout;
|
|
137
|
+
const dispose = () => {
|
|
138
|
+
if (timeout !== undefined) {
|
|
139
|
+
clearTimeout(timeout);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const execute = (...args) => {
|
|
143
|
+
dispose();
|
|
144
|
+
timeout = setTimeout(() => {
|
|
145
|
+
cb(...args);
|
|
146
|
+
}, debounceTime);
|
|
147
|
+
};
|
|
148
|
+
return {
|
|
149
|
+
execute,
|
|
150
|
+
dispose,
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
|
|
104
154
|
const toggleClassName = (el, className, remove = false) => {
|
|
105
155
|
if (!el.classList.contains(className)) {
|
|
106
156
|
el.classList.add(className);
|
|
@@ -367,6 +417,7 @@ class CacheMap extends EventEmitter {
|
|
|
367
417
|
}
|
|
368
418
|
}
|
|
369
419
|
|
|
420
|
+
const TRACK_BOX_CHANGE_EVENT_NAME = 'change';
|
|
370
421
|
/**
|
|
371
422
|
* An object that performs tracking, calculations and caching.
|
|
372
423
|
* @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list
|
|
@@ -402,50 +453,54 @@ class TrackBox extends CacheMap {
|
|
|
402
453
|
this.fireChange();
|
|
403
454
|
return v;
|
|
404
455
|
}
|
|
405
|
-
|
|
456
|
+
_fireChanges = (version) => {
|
|
457
|
+
this.dispatch(TRACK_BOX_CHANGE_EVENT_NAME, version);
|
|
458
|
+
};
|
|
459
|
+
_debounceChanges = debounce(this._fireChanges, 0);
|
|
406
460
|
fireChange() {
|
|
407
|
-
this.
|
|
408
|
-
this._fireChangeTimeouts.push(setTimeout(() => { this.dispatchAsync('change', this._version); }));
|
|
409
|
-
}
|
|
410
|
-
clearchangesTimeouts() {
|
|
411
|
-
while (this._fireChangeTimeouts.length > 0) {
|
|
412
|
-
const timeout = this._fireChangeTimeouts.pop();
|
|
413
|
-
clearTimeout(timeout);
|
|
414
|
-
}
|
|
461
|
+
this._debounceChanges.execute(this._version);
|
|
415
462
|
}
|
|
416
463
|
recalculateMetrics(options) {
|
|
417
464
|
const { bounds, collection, dynamicSize, isVertical, itemSize, itemsOffset, scrollSize, snap, } = options;
|
|
418
|
-
const { width, height } = bounds, sizeProperty = isVertical ?
|
|
419
|
-
let itemsFromStartToScrollEnd = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1, leftItemLength = 0, rightItemLength = 0, leftItemsWeight = 0, rightItemsWeight = 0, startIndex;
|
|
465
|
+
const { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width, weightToDisplayEnd = scrollSize + height, totalLength = collection.length, typicalItemSize = itemSize, totalSize = dynamicSize ? this.getBoundsFromCache(collection, typicalItemSize, isVertical) : totalLength * typicalItemSize, snippedPos = Math.floor(scrollSize), leftItemsWeights = [];
|
|
466
|
+
let itemsFromStartToScrollEnd = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1, leftItemLength = 0, rightItemLength = 0, leftItemsWeight = 0, rightItemsWeight = 0, leftHiddenItemsWeight = 0, totalItemsToDisplayEndWeight = 0, startIndex;
|
|
420
467
|
if (dynamicSize) {
|
|
421
468
|
let y = 0;
|
|
422
469
|
for (let i = 0, l = collection.length; i < l; i++) {
|
|
423
|
-
const collectionItem = collection[i], map = this._map;
|
|
424
|
-
let
|
|
470
|
+
const ii = i + 1, collectionItem = collection[i], map = this._map;
|
|
471
|
+
let componentSize = 0;
|
|
425
472
|
if (map.has(collectionItem.id)) {
|
|
426
473
|
const bounds = map.get(collectionItem.id);
|
|
427
|
-
|
|
474
|
+
componentSize = bounds ? bounds[sizeProperty] : typicalItemSize;
|
|
428
475
|
}
|
|
429
476
|
else {
|
|
430
|
-
|
|
477
|
+
componentSize = typicalItemSize;
|
|
431
478
|
}
|
|
432
|
-
if (
|
|
433
|
-
|
|
434
|
-
|
|
479
|
+
if (y < scrollSize - componentSize) {
|
|
480
|
+
leftItemsWeights.push(componentSize);
|
|
481
|
+
leftHiddenItemsWeight += componentSize;
|
|
482
|
+
itemsFromStartToScrollEnd = ii;
|
|
435
483
|
}
|
|
436
|
-
if (
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
}
|
|
484
|
+
if (y < scrollSize + size + componentSize) {
|
|
485
|
+
itemsFromStartToDisplayEnd = ii;
|
|
486
|
+
totalItemsToDisplayEndWeight += componentSize;
|
|
487
|
+
itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + itemsOffset;
|
|
441
488
|
}
|
|
442
|
-
else {
|
|
443
|
-
|
|
444
|
-
rightItemsWeight += itemSize;
|
|
445
|
-
}
|
|
489
|
+
else if (i < itemsFromDisplayEndToOffsetEnd) {
|
|
490
|
+
rightItemsWeight += componentSize;
|
|
446
491
|
}
|
|
447
|
-
y +=
|
|
492
|
+
y += componentSize;
|
|
493
|
+
}
|
|
494
|
+
if (itemsFromStartToScrollEnd === -1) {
|
|
495
|
+
itemsFromStartToScrollEnd = 0;
|
|
496
|
+
}
|
|
497
|
+
if (itemsFromStartToDisplayEnd === -1) {
|
|
498
|
+
itemsFromStartToDisplayEnd = 0;
|
|
448
499
|
}
|
|
500
|
+
leftItemsWeights.splice(0, leftItemsWeights.length - itemsOffset);
|
|
501
|
+
leftItemsWeights.forEach(v => {
|
|
502
|
+
leftItemsWeight += v;
|
|
503
|
+
});
|
|
449
504
|
leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);
|
|
450
505
|
rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength
|
|
451
506
|
? totalLength - itemsFromStartToDisplayEnd : itemsOffset;
|
|
@@ -459,13 +514,16 @@ class TrackBox extends CacheMap {
|
|
|
459
514
|
? totalLength - itemsFromStartToDisplayEnd : itemsOffset;
|
|
460
515
|
startIndex = itemsFromStartToScrollEnd - leftItemLength;
|
|
461
516
|
leftItemsWeight = leftItemLength * typicalItemSize;
|
|
462
|
-
rightItemsWeight = rightItemLength * typicalItemSize
|
|
517
|
+
rightItemsWeight = rightItemLength * typicalItemSize,
|
|
518
|
+
leftHiddenItemsWeight = itemsFromStartToScrollEnd * typicalItemSize,
|
|
519
|
+
totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * typicalItemSize;
|
|
463
520
|
}
|
|
464
|
-
const
|
|
521
|
+
const itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight, itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd;
|
|
465
522
|
const metrics = {
|
|
466
523
|
itemsFromStartToScrollEnd,
|
|
467
524
|
itemsFromStartToDisplayEnd,
|
|
468
525
|
itemsOnDisplay,
|
|
526
|
+
itemsOnDisplayLength,
|
|
469
527
|
leftHiddenItemsWeight,
|
|
470
528
|
leftItemLength,
|
|
471
529
|
leftItemsWeight,
|
|
@@ -478,37 +536,14 @@ class TrackBox extends CacheMap {
|
|
|
478
536
|
};
|
|
479
537
|
return metrics;
|
|
480
538
|
}
|
|
481
|
-
/**
|
|
482
|
-
* Calculates and returns the maximum size of a repeating item
|
|
483
|
-
*/
|
|
484
|
-
getTypicalItemSize(isVertical, defaultItemSize, fromIndex = 0, to = -1) {
|
|
485
|
-
const sizeProperty = isVertical ? 'height' : 'width', sizes = {};
|
|
486
|
-
let maxRepeatingSize = defaultItemSize, count = 0;
|
|
487
|
-
this._map.forEach(bound => {
|
|
488
|
-
const size = bound[sizeProperty];
|
|
489
|
-
if (sizes.hasOwnProperty(size)) {
|
|
490
|
-
sizes[size] += 1;
|
|
491
|
-
}
|
|
492
|
-
else {
|
|
493
|
-
sizes[size] = 1;
|
|
494
|
-
}
|
|
495
|
-
if (sizes[size] > count) {
|
|
496
|
-
count = sizes[size];
|
|
497
|
-
maxRepeatingSize = size;
|
|
498
|
-
}
|
|
499
|
-
});
|
|
500
|
-
return maxRepeatingSize;
|
|
501
|
-
}
|
|
502
539
|
/**
|
|
503
540
|
* tracking by propName
|
|
504
541
|
*/
|
|
505
|
-
track(
|
|
542
|
+
track() {
|
|
506
543
|
if (!this._items || !this._displayComponents) {
|
|
507
544
|
return;
|
|
508
545
|
}
|
|
509
|
-
this._tracker.track(this._items, this._displayComponents
|
|
510
|
-
this.cacheElementBounds(component, item);
|
|
511
|
-
} : undefined);
|
|
546
|
+
this._tracker.track(this._items, this._displayComponents);
|
|
512
547
|
}
|
|
513
548
|
setDisplayObjectIndexMapById(v) {
|
|
514
549
|
this._tracker.displayObjectIndexMapById = v;
|
|
@@ -516,19 +551,24 @@ class TrackBox extends CacheMap {
|
|
|
516
551
|
untrackComponentByIdProperty(component) {
|
|
517
552
|
this._tracker.untrackComponentByIdProperty(component);
|
|
518
553
|
}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
554
|
+
cacheElements() {
|
|
555
|
+
if (!this._displayComponents) {
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
for (let i = 0, l = this._displayComponents.length; i < l; i++) {
|
|
559
|
+
const component = this._displayComponents[i], itemId = component.instance.itemId;
|
|
560
|
+
if (itemId === undefined) {
|
|
561
|
+
continue;
|
|
562
|
+
}
|
|
563
|
+
const bounds = component.instance.getBounds();
|
|
564
|
+
this.set(itemId, bounds);
|
|
565
|
+
}
|
|
526
566
|
}
|
|
527
567
|
/**
|
|
528
568
|
* Returns calculated bounds from cache
|
|
529
569
|
*/
|
|
530
570
|
getBoundsFromCache(items, typicalItemSize, isVertical) {
|
|
531
|
-
const sizeProperty = isVertical ?
|
|
571
|
+
const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, map = this._map;
|
|
532
572
|
let size = 0;
|
|
533
573
|
for (let i = 0, l = items.length; i < l; i++) {
|
|
534
574
|
const item = items[i];
|
|
@@ -544,7 +584,9 @@ class TrackBox extends CacheMap {
|
|
|
544
584
|
}
|
|
545
585
|
dispose() {
|
|
546
586
|
super.dispose();
|
|
547
|
-
this.
|
|
587
|
+
if (this._debounceChanges) {
|
|
588
|
+
this._debounceChanges.dispose();
|
|
589
|
+
}
|
|
548
590
|
if (this._tracker) {
|
|
549
591
|
this._tracker.dispose();
|
|
550
592
|
}
|
|
@@ -633,7 +675,10 @@ class NgVirtualListComponent {
|
|
|
633
675
|
_onScrollEndHandler = (e) => {
|
|
634
676
|
const target = e.target, s = this.itemSize(), itemSize = s < 0 ? DEFAULT_ITEM_SIZE : s, snapToItem = this.snapToItem(), scrollSize = this._isVertical ? target.scrollTop : target.scrollLeft, scrollItems = Math.round(scrollSize / itemSize), actualScrollSize = snapToItem ? scrollItems * itemSize : scrollSize;
|
|
635
677
|
if (target.scrollTop !== actualScrollSize) {
|
|
636
|
-
const container = target, params = {
|
|
678
|
+
const container = target, params = {
|
|
679
|
+
[this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,
|
|
680
|
+
behavior: BEHAVIOR_INSTANT
|
|
681
|
+
};
|
|
637
682
|
container.scroll(params);
|
|
638
683
|
}
|
|
639
684
|
this.onScrollEnd.emit(e);
|
|
@@ -658,17 +703,17 @@ class NgVirtualListComponent {
|
|
|
658
703
|
$isVertical.pipe(takeUntilDestroyed(), tap(v => {
|
|
659
704
|
this._isVertical = v;
|
|
660
705
|
const el = this._elementRef.nativeElement;
|
|
661
|
-
toggleClassName(el, v ?
|
|
706
|
+
toggleClassName(el, v ? CLASS_LIST_VERTICAL : CLASS_LIST_HORIZONTAL, true);
|
|
662
707
|
})).subscribe();
|
|
663
708
|
$dynamicSize.pipe(takeUntilDestroyed(), tap(dynamicSize => {
|
|
664
709
|
if (dynamicSize) {
|
|
665
|
-
if (!this._trackBox.hasEventListener(
|
|
666
|
-
this._trackBox.addEventListener(
|
|
710
|
+
if (!this._trackBox.hasEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler)) {
|
|
711
|
+
this._trackBox.addEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler);
|
|
667
712
|
}
|
|
668
713
|
}
|
|
669
714
|
else {
|
|
670
|
-
if (this._trackBox.hasEventListener(
|
|
671
|
-
this._trackBox.removeEventListener(
|
|
715
|
+
if (this._trackBox.hasEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler)) {
|
|
716
|
+
this._trackBox.removeEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler);
|
|
672
717
|
}
|
|
673
718
|
}
|
|
674
719
|
})).subscribe();
|
|
@@ -678,27 +723,28 @@ class NgVirtualListComponent {
|
|
|
678
723
|
combineLatest([$initialized, $bounds, $items, $stickyMap, $scrollSize, $itemSize,
|
|
679
724
|
$itemsOffset, $snap, $isVertical, $dynamicSize, $cacheVersion,
|
|
680
725
|
]).pipe(takeUntilDestroyed(), distinctUntilChanged(), filter(([initialized]) => !!initialized), switchMap(([, bounds, items, stickyMap, scrollSize, itemSize, itemsOffset, snap, isVertical, dynamicSize, cacheVersion,]) => {
|
|
681
|
-
|
|
726
|
+
this._trackBox.cacheElements();
|
|
727
|
+
const { width, height } = bounds, { itemsFromStartToScrollEnd, itemsOnDisplay, itemsOnDisplayLength, leftHiddenItemsWeight, leftItemLength, leftItemsWeight, rightItemLength, rightItemsWeight, snippedPos, totalSize, typicalItemSize, } = this._trackBox.recalculateMetrics({
|
|
682
728
|
bounds: { width, height }, collection: items,
|
|
683
729
|
dynamicSize, isVertical, itemSize, itemsOffset, scrollSize, snap,
|
|
684
730
|
});
|
|
685
|
-
// Нужно сперва сделать корректные расчеты для dynamicSize. Сейчас количества элементов в облостях высчитывается не корректно!
|
|
686
731
|
// Необходима кореляция startDisplayObjectY с помощью дельты от высоты предыдущей и текущей размеченной области по версии кэша.
|
|
687
732
|
// TrackBox может расчитать дельту!
|
|
688
733
|
return of({
|
|
689
734
|
items, stickyMap, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd,
|
|
690
|
-
itemsOnDisplay, leftHiddenItemsWeight, itemSize: typicalItemSize,
|
|
691
|
-
leftItemLength, leftItemsWeight, rightItemsWeight, snippedPos,
|
|
735
|
+
itemsOnDisplay, itemsOnDisplayLength, leftHiddenItemsWeight, itemSize: typicalItemSize,
|
|
736
|
+
totalSize, snap, leftItemLength, leftItemsWeight, rightItemLength, rightItemsWeight, snippedPos,
|
|
737
|
+
dynamicSize,
|
|
692
738
|
});
|
|
693
|
-
}), tap(({ items, stickyMap, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd, itemsOnDisplay, leftHiddenItemsWeight, leftItemLength, leftItemsWeight, rightItemsWeight, snippedPos, itemSize, totalSize, snap, dynamicSize: dynamic, }) => {
|
|
739
|
+
}), tap(({ items, stickyMap, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd, itemsOnDisplay, itemsOnDisplayLength, leftHiddenItemsWeight, leftItemLength, leftItemsWeight, rightItemLength, rightItemsWeight, snippedPos, itemSize, totalSize, snap, dynamicSize: dynamic, }) => {
|
|
694
740
|
const displayItems = [];
|
|
695
741
|
if (items.length) {
|
|
696
|
-
const sizeProperty = isVertical ?
|
|
697
|
-
let pos = leftHiddenItemsWeight - leftItemsWeight,
|
|
742
|
+
const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, w = isVertical ? width : itemSize, h = isVertical ? itemSize : height, totalItems = items.length, startIndex = itemsFromStartToScrollEnd - leftItemLength;
|
|
743
|
+
let pos = leftHiddenItemsWeight - leftItemsWeight, renderItems = itemsOnDisplayLength + leftItemLength + rightItemLength, stickyItem, nextSticky, stickyItemIndex = -1, stickyItemSize = 0;
|
|
698
744
|
if (snap) {
|
|
699
745
|
for (let i = itemsFromStartToScrollEnd - 1; i >= 0; i--) {
|
|
700
|
-
const id = items[i].id, sticky = stickyMap[id];
|
|
701
|
-
stickyItemSize =
|
|
746
|
+
const id = items[i].id, sticky = stickyMap[id], size = dynamic ? this._trackBox.get(id)?.[sizeProperty] || itemSize : itemSize;
|
|
747
|
+
stickyItemSize = size;
|
|
702
748
|
if (sticky > 0) {
|
|
703
749
|
const measures = {
|
|
704
750
|
x: isVertical ? 0 : snippedPos,
|
|
@@ -721,7 +767,7 @@ class NgVirtualListComponent {
|
|
|
721
767
|
}
|
|
722
768
|
}
|
|
723
769
|
let i = startIndex;
|
|
724
|
-
while (
|
|
770
|
+
while (renderItems > 0) {
|
|
725
771
|
if (i >= totalItems) {
|
|
726
772
|
break;
|
|
727
773
|
}
|
|
@@ -748,11 +794,11 @@ class NgVirtualListComponent {
|
|
|
748
794
|
}
|
|
749
795
|
displayItems.push(item);
|
|
750
796
|
}
|
|
751
|
-
|
|
797
|
+
renderItems -= 1;
|
|
752
798
|
pos += size;
|
|
753
799
|
i++;
|
|
754
800
|
}
|
|
755
|
-
const axis = isVertical ?
|
|
801
|
+
const axis = isVertical ? Y_PROP_NAME : X_PROP_NAME;
|
|
756
802
|
if (nextSticky && stickyItem && nextSticky.measures[axis] <= scrollSize + stickyItemSize) {
|
|
757
803
|
if (nextSticky.measures[axis] > scrollSize) {
|
|
758
804
|
stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItemSize;
|
|
@@ -818,34 +864,34 @@ class NgVirtualListComponent {
|
|
|
818
864
|
* tracking by id
|
|
819
865
|
*/
|
|
820
866
|
tracking() {
|
|
821
|
-
this._trackBox.track(
|
|
867
|
+
this._trackBox.track();
|
|
822
868
|
}
|
|
823
869
|
resetBoundsSize(isVertical, totalSize) {
|
|
824
870
|
const l = this._list();
|
|
825
871
|
if (l) {
|
|
826
|
-
l.nativeElement.style[isVertical ?
|
|
872
|
+
l.nativeElement.style[isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME] = `${totalSize}${PX}`;
|
|
827
873
|
}
|
|
828
874
|
}
|
|
829
875
|
/**
|
|
830
876
|
* The method scrolls the list to the element with the given id and returns the value of the scrolled area.
|
|
831
877
|
* Behavior accepts the values "auto", "instant" and "smooth".
|
|
832
878
|
*/
|
|
833
|
-
scrollTo(id, behavior =
|
|
879
|
+
scrollTo(id, behavior = BEHAVIOR_AUTO) {
|
|
834
880
|
const items = this.items();
|
|
835
881
|
if (!items || !items.length) {
|
|
836
882
|
return;
|
|
837
883
|
}
|
|
838
884
|
const index = items.findIndex(item => item.id === id), scrollSize = index * this.itemSize(), container = this._container();
|
|
839
885
|
if (container) {
|
|
840
|
-
const params = { [this._isVertical ?
|
|
886
|
+
const params = { [this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior };
|
|
841
887
|
container.nativeElement.scroll(params);
|
|
842
888
|
}
|
|
843
889
|
}
|
|
844
890
|
ngAfterViewInit() {
|
|
845
891
|
const containerEl = this._container();
|
|
846
892
|
if (containerEl) {
|
|
847
|
-
containerEl.nativeElement.addEventListener(
|
|
848
|
-
containerEl.nativeElement.addEventListener(
|
|
893
|
+
containerEl.nativeElement.addEventListener(SCROLL, this._onScrollHandler);
|
|
894
|
+
containerEl.nativeElement.addEventListener(SCROLL_END, this._onScrollEndHandler);
|
|
849
895
|
this._resizeObserver = new ResizeObserver(this._onResizeHandler);
|
|
850
896
|
this._resizeObserver.observe(containerEl.nativeElement);
|
|
851
897
|
this._onResizeHandler();
|
|
@@ -857,8 +903,8 @@ class NgVirtualListComponent {
|
|
|
857
903
|
}
|
|
858
904
|
const containerEl = this._container();
|
|
859
905
|
if (containerEl) {
|
|
860
|
-
containerEl.nativeElement.removeEventListener(
|
|
861
|
-
containerEl.nativeElement.removeEventListener(
|
|
906
|
+
containerEl.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);
|
|
907
|
+
containerEl.nativeElement.removeEventListener(SCROLL_END, this._onScrollEndHandler);
|
|
862
908
|
if (this._resizeObserver) {
|
|
863
909
|
this._resizeObserver.unobserve(containerEl.nativeElement);
|
|
864
910
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-virtual-list.mjs","sources":["../../../projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.ts","../../../projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.html","../../../projects/ng-virtual-list/src/lib/enums/directions.ts","../../../projects/ng-virtual-list/src/lib/const/index.ts","../../../projects/ng-virtual-list/src/lib/utils/isDirection.ts","../../../projects/ng-virtual-list/src/lib/utils/toggleClassName.ts","../../../projects/ng-virtual-list/src/lib/utils/tracker.ts","../../../projects/ng-virtual-list/src/lib/utils/eventEmitter.ts","../../../projects/ng-virtual-list/src/lib/utils/cacheMap.ts","../../../projects/ng-virtual-list/src/lib/utils/trackBox.ts","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.component.html","../../../projects/ng-virtual-list/src/public-api.ts","../../../projects/ng-virtual-list/src/ng-virtual-list.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, ElementRef, inject, signal, TemplateRef } from '@angular/core';\r\nimport { IRenderVirtualListItem } from '../models/render-item.model';\r\nimport { IRect } from '../types';\r\n\r\n/**\r\n * Virtual list item component\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\n@Component({\r\n selector: 'ng-virtual-list-item',\r\n imports: [CommonModule],\r\n templateUrl: './ng-virtual-list-item.component.html',\r\n styleUrl: './ng-virtual-list-item.component.scss',\r\n host: {\r\n 'class': 'ngvl__item',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgVirtualListItemComponent {\r\n private static __nextId: number = 0;\r\n\r\n private _id!: number;\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n data = signal<IRenderVirtualListItem | undefined>(undefined);\r\n private _data: IRenderVirtualListItem | undefined = undefined;\r\n set item(v: IRenderVirtualListItem | undefined) {\r\n if (this._data === v) {\r\n return;\r\n }\r\n\r\n const data = this._data = v;\r\n\r\n if (data) {\r\n const styles = this._elementRef.nativeElement.style;\r\n styles.zIndex = data.config.sticky;\r\n if (data.config.snapped) {\r\n styles.transform = 'translate3d(0,0,0)';\r\n styles.position = 'sticky';\r\n } else {\r\n styles.position = 'absolute';\r\n styles.transform = `translate3d(${data.config.isVertical ? 0 : data.measures.x}px, ${data.config.isVertical ? data.measures.y : 0}px , 0)`;\r\n }\r\n styles.height = data.config.isVertical ? data.config.dynamic ? 'auto' : `${data.measures.height}px` : '100%';\r\n styles.width = data.config.isVertical ? '100%' : data.config.dynamic ? 'auto' : `${data.measures.width}px`;\r\n }\r\n\r\n this.data.set(v);\r\n }\r\n\r\n itemRenderer = signal<TemplateRef<any> | undefined>(undefined);\r\n\r\n set renderer(v: TemplateRef<any> | undefined) {\r\n this.itemRenderer.set(v);\r\n }\r\n\r\n private _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n constructor() {\r\n this._id = NgVirtualListItemComponent.__nextId = NgVirtualListItemComponent.__nextId === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListItemComponent.__nextId + 1;\r\n }\r\n\r\n getBounds(): IRect {\r\n const el: HTMLElement = this._elementRef.nativeElement,\r\n { width, height, left, top } = el.getBoundingClientRect();\r\n return { width, height, x: left, y: top };\r\n }\r\n\r\n showIfNeed() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === 'visible') {\r\n return;\r\n }\r\n\r\n styles.visibility = 'visible';\r\n }\r\n\r\n hide() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === 'hidden') {\r\n return;\r\n }\r\n\r\n styles.visibility = 'hidden';\r\n }\r\n}\r\n","@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem part=\"item\" class=\"ngvl-item__container\">\r\n @if (renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\" [ngTemplateOutletContext]=\"{data: item.data || {}}\" />\r\n }\r\n</li>\r\n}","export enum Directions {\r\n HORIZONTAL = 'horizontal',\r\n VERTICAL = 'vertical',\r\n}","import { Directions } from \"../enums/directions\";\r\n\r\nexport const DEFAULT_ITEM_SIZE = 24;\r\n\r\nexport const DEFAULT_ITEMS_OFFSET = 2;\r\n\r\nexport const DEFAULT_LIST_SIZE = 400;\r\n\r\nexport const DEFAULT_SNAP = false;\r\n\r\nexport const DEFAULT_SNAP_TO_ITEM = false;\r\n\r\nexport const DEFAULT_DYNAMIC_SIZE = false;\r\n\r\nexport const TRACK_BY_PROPERTY_NAME = 'id';\r\n\r\nexport const DEFAULT_DIRECTION = Directions.VERTICAL;\r\n\r\nexport const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;\r\n","import { Direction, Directions } from \"../enums\";\r\n\r\nconst HORIZONTAL_ALIASES = [Directions.HORIZONTAL, 'horizontal'],\r\n VERTICAL_ALIASES = [Directions.VERTICAL, 'vertical']\r\n ;\r\n\r\nexport const isDirection = (src: Direction, expected: Direction): boolean => {\r\n if (HORIZONTAL_ALIASES.includes(expected)) {\r\n return HORIZONTAL_ALIASES.includes(src);\r\n }\r\n return VERTICAL_ALIASES.includes(src);\r\n}","export const toggleClassName = (el: HTMLElement, className: string, remove = false) => {\r\n if (!el.classList.contains(className)) {\r\n el.classList.add(className);\r\n } else if (remove) {\r\n el.classList.remove(className);\r\n }\r\n};\r\n","import { ComponentRef } from \"@angular/core\";\r\n\r\ntype TrackingPropertyId = string | number;\r\n\r\n/**\r\n * Tracks display items by property\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class Tracker<I = any, C = { [prop: string]: any; }> {\r\n /**\r\n * display objects dictionary of indexes by id\r\n */\r\n private _displayObjectIndexMapById: { [id: number]: number } = {};\r\n\r\n set displayObjectIndexMapById(v: { [id: number]: number }) {\r\n if (this._displayObjectIndexMapById === v) {\r\n return;\r\n }\r\n\r\n this._displayObjectIndexMapById = v;\r\n }\r\n\r\n get displayObjectIndexMapById() {\r\n return this._displayObjectIndexMapById;\r\n }\r\n\r\n /**\r\n * Dictionary displayItems propertyNameId by items propertyNameId\r\n */\r\n private _trackMap: { [id: TrackingPropertyId]: number } | null = {};\r\n\r\n get trackMap() {\r\n return this._trackMap;\r\n }\r\n\r\n private _trackingPropertyName!: string;\r\n\r\n constructor(trackingPropertyName: string) {\r\n this._trackingPropertyName = trackingPropertyName;\r\n }\r\n\r\n /**\r\n * tracking by propName\r\n */\r\n track(items: Array<any>, components: Array<ComponentRef<any>>,\r\n afterComponentSetup?: (component: C, item: I) => void): void {\r\n if (!items) {\r\n return;\r\n }\r\n\r\n const idPropName = this._trackingPropertyName, untrackedItems = [...components];\r\n\r\n for (let i = 0, l = items.length; i < l; i++) {\r\n const item = items[i], itemTrackingProperty = item[idPropName];\r\n\r\n if (this._trackMap) {\r\n const diId = this._trackMap[itemTrackingProperty];\r\n if (this._trackMap.hasOwnProperty(itemTrackingProperty)) {\r\n const lastIndex = this._displayObjectIndexMapById[diId], el = components[lastIndex];\r\n\r\n this._checkComponentProperty(el?.instance);\r\n\r\n const elId = el?.instance?.[itemTrackingProperty];\r\n if (el && elId === diId) {\r\n const indexByUntrackedItems = untrackedItems.findIndex(v => {\r\n this._checkComponentProperty(v.instance);\r\n\r\n return v.instance[itemTrackingProperty] === elId;\r\n });\r\n if (indexByUntrackedItems > -1) {\r\n el.instance.item = item;\r\n\r\n if (afterComponentSetup !== undefined) {\r\n afterComponentSetup(el.instance, item);\r\n }\r\n\r\n untrackedItems.splice(indexByUntrackedItems, 1);\r\n continue;\r\n }\r\n }\r\n delete this._trackMap[itemTrackingProperty];\r\n }\r\n }\r\n\r\n if (untrackedItems.length > 0) {\r\n const el = untrackedItems.shift(), item = items[i];\r\n if (el) {\r\n el.instance.item = item;\r\n\r\n if (this._trackMap) {\r\n this._checkComponentProperty(el.instance);\r\n\r\n this._trackMap[itemTrackingProperty] = el.instance[itemTrackingProperty];\r\n }\r\n\r\n if (afterComponentSetup !== undefined) {\r\n afterComponentSetup(el.instance, item);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (untrackedItems.length) {\r\n throw Error('Tracking by id caused an error.')\r\n }\r\n }\r\n\r\n untrackComponentByIdProperty(component?: C): void {\r\n if (!component) {\r\n return;\r\n }\r\n\r\n const propertyIdName = this._trackingPropertyName;\r\n\r\n this._checkComponentProperty(component);\r\n\r\n if (this._trackMap && (component as any)[propertyIdName] !== undefined) {\r\n delete this._trackMap[propertyIdName];\r\n }\r\n }\r\n\r\n private _checkComponentProperty(component?: C): void {\r\n if (!component) {\r\n return;\r\n }\r\n\r\n const propertyIdName = this._trackingPropertyName;\r\n\r\n try {\r\n (component as any)[propertyIdName];\r\n } catch (err) {\r\n throw Error(`Property ${propertyIdName} does not exist.`);\r\n }\r\n }\r\n\r\n dispose() {\r\n this._trackMap = null;\r\n }\r\n}","export type TEventHandler = (...args: Array<any>) => void;\r\n\r\n/**\r\n * Simple event emitter\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class EventEmitter<E = string, H = TEventHandler> {\r\n private _listeners: {\r\n [eventName: string]: Array<TEventHandler>,\r\n } = {};\r\n\r\n protected _disposed: boolean = false;\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Emits the event\r\n */\r\n dispatch(event: E, ...args: Array<any>): void {\r\n const ctx = this;\r\n const listeners = this._listeners[event as string];\r\n if (Array.isArray(listeners)) {\r\n for (let i = 0, l = listeners.length; i < l; i++) {\r\n const listener = listeners[i];\r\n if (listener) {\r\n listener.apply(ctx, args);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Emits the event async\r\n */\r\n dispatchAsync(event: E, ...args: Array<any>): void {\r\n queueMicrotask(() => {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this.dispatch(event, ...args);\r\n });\r\n }\r\n\r\n /**\r\n * Returns true if the event listener is already subscribed.\r\n */\r\n hasEventListener(eventName: E, handler: H): boolean {\r\n const event = eventName as string;\r\n if (this._listeners.hasOwnProperty(event)) {\r\n const listeners = this._listeners[event];\r\n const index = listeners.findIndex(v => v === handler);\r\n if (index > -1) {\r\n return true;\r\n }\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * Add event listener\r\n */\r\n addEventListener(eventName: E, handler: H): void {\r\n const event = eventName as string;\r\n if (!this._listeners.hasOwnProperty(event)) {\r\n this._listeners[event] = [];\r\n }\r\n this._listeners[event].push(handler as TEventHandler);\r\n }\r\n\r\n /**\r\n * Remove event listener\r\n */\r\n removeEventListener(eventName: E, handler: H): void {\r\n const event = eventName as string;\r\n if (!this._listeners.hasOwnProperty(event)) {\r\n return;\r\n }\r\n const listeners = this._listeners[event], index = listeners.findIndex(v => v === handler);\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n\r\n if (listeners.length === 0) {\r\n delete this._listeners[event];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all listeners\r\n */\r\n removeAllListeners() {\r\n const events = Object.keys(this._listeners);\r\n while (events.length > 0) {\r\n const event = events.pop();\r\n if (event) {\r\n const listeners = this._listeners[event];\r\n if (Array.isArray(listeners)) {\r\n while (listeners.length > 0) {\r\n const listener = listeners.pop();\r\n if (listener) {\r\n this.removeEventListener(event as E, listener as H);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n dispose() {\r\n this._disposed = true;\r\n\r\n this.removeAllListeners();\r\n }\r\n}","import { EventEmitter } from \"./eventEmitter\";\r\n\r\nexport interface ICacheMap<I = any, B = any> {\r\n set: (id: I, bounds: B) => Map<I, B>;\r\n has: (id: I) => boolean;\r\n get: (id: I) => B | undefined;\r\n forEach: (callbackfn: (value: B, key: I, map: Map<I, B>) => void, thisArg?: any) => void;\r\n}\r\n\r\ntype CacheMapEvents = 'change';\r\n\r\ntype OnChangeEventListener = (version: number) => void;\r\n\r\ntype CacheMapListeners = OnChangeEventListener;\r\n\r\n/**\r\n * Cache map.\r\n * Emits a change event on each mutation.\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class CacheMap<I = string | number, B = any, E = CacheMapEvents, L = CacheMapListeners> extends EventEmitter<E, L> implements ICacheMap {\r\n protected _map = new Map<I, B>();\r\n\r\n protected _version: number = 0;\r\n\r\n get version() {\r\n return this._version;\r\n }\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected bumpVersion() {\r\n this._version = this._version === Number.MAX_SAFE_INTEGER ? 0 : this._version + 1;\r\n }\r\n\r\n protected fireChange() {\r\n this.dispatch('change' as E, this.version);\r\n }\r\n\r\n set(id: I, bounds: B): Map<I, B> {\r\n if (this._map.has(id) && JSON.stringify(this._map.get(id)) === JSON.stringify(bounds)) {\r\n return this._map;\r\n }\r\n\r\n const v = this._map.set(id, bounds);\r\n\r\n this.bumpVersion();\r\n\r\n this.fireChange();\r\n\r\n return v;\r\n }\r\n\r\n has(id: I): boolean {\r\n return this._map.has(id);\r\n }\r\n\r\n get(id: I): B | undefined {\r\n return this._map.get(id);\r\n }\r\n\r\n forEach(callbackfn: (value: B, key: I, map: Map<I, B>) => void, thisArg?: any): void {\r\n return this._map.forEach(callbackfn, thisArg);\r\n }\r\n\r\n override dispose() {\r\n super.dispose();\r\n\r\n this._map.clear();\r\n }\r\n}","import { ComponentRef } from \"@angular/core\";\r\nimport { NgVirtualListItemComponent } from \"../components/ng-virtual-list-item.component\";\r\nimport { IVirtualListCollection } from \"../models/collection.model\";\r\nimport { IRenderVirtualListCollection } from \"../models/render-collection.model\";\r\nimport { IRenderVirtualListItem } from \"../models/render-item.model\";\r\nimport { Id } from \"../types/id\";\r\nimport { IRect } from \"../types/rect\";\r\nimport { CacheMap } from \"./cacheMap\";\r\nimport { Tracker } from \"./tracker\";\r\nimport { ISize } from \"../types\";\r\n\r\nexport interface IMetrics {\r\n itemsFromStartToScrollEnd: number;\r\n itemsFromStartToDisplayEnd: number;\r\n itemsOnDisplay: number;\r\n leftHiddenItemsWeight: number;\r\n leftItemLength: number;\r\n leftItemsWeight: number;\r\n rightItemLength: number;\r\n rightItemsWeight: number;\r\n snippedPos: number;\r\n totalItemsToDisplayEndWeight: number;\r\n totalSize: number;\r\n typicalItemSize: number;\r\n}\r\n\r\ninterface IRecalculateMetricsOptions {\r\n bounds: ISize;\r\n collection: IVirtualListCollection;\r\n isVertical: boolean;\r\n itemSize: number;\r\n itemsOffset: number;\r\n dynamicSize: boolean;\r\n scrollSize: number;\r\n snap: boolean;\r\n}\r\n\r\ntype CacheMapEvents = 'change';\r\n\r\ntype OnChangeEventListener = (version: number) => void;\r\n\r\ntype CacheMapListeners = OnChangeEventListener;\r\n\r\n/**\r\n * An object that performs tracking, calculations and caching.\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class TrackBox extends CacheMap<Id, IRect, CacheMapEvents, CacheMapListeners> {\r\n protected _tracker!: Tracker<IRenderVirtualListItem, NgVirtualListItemComponent>;\r\n\r\n protected _items: IRenderVirtualListCollection | null | undefined;\r\n\r\n set items(v: IRenderVirtualListCollection | null | undefined) {\r\n if (this._items === v) {\r\n return;\r\n }\r\n\r\n this._items = v;\r\n }\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined;\r\n\r\n set displayComponents(v: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined) {\r\n if (this._displayComponents === v) {\r\n return;\r\n }\r\n\r\n this._displayComponents = v;\r\n }\r\n\r\n constructor(trackingPropertyName: string) {\r\n super();\r\n\r\n this._tracker = new Tracker(trackingPropertyName);\r\n }\r\n\r\n override set(id: Id, bounds: IRect): Map<Id, IRect> {\r\n if (this._map.has(id) && JSON.stringify(this._map.get(id)) === JSON.stringify(bounds)) {\r\n return this._map;\r\n }\r\n\r\n const v = this._map.set(id, bounds);\r\n\r\n this.bumpVersion();\r\n\r\n this.fireChange();\r\n\r\n return v;\r\n }\r\n\r\n private _fireChangeTimeouts: Array<any> = [];\r\n\r\n protected override fireChange() {\r\n this.clearchangesTimeouts();\r\n\r\n this._fireChangeTimeouts.push(setTimeout(() => { this.dispatchAsync('change', this._version) }));\r\n }\r\n\r\n private clearchangesTimeouts() {\r\n while (this._fireChangeTimeouts.length > 0) {\r\n const timeout = this._fireChangeTimeouts.pop();\r\n clearTimeout(timeout);\r\n }\r\n }\r\n\r\n recalculateMetrics(options: IRecalculateMetricsOptions): IMetrics {\r\n const { bounds, collection, dynamicSize, isVertical, itemSize, itemsOffset, scrollSize, snap, } = options;\r\n\r\n const { width, height } = bounds, sizeProperty = isVertical ? 'height' : 'width', size = isVertical ? height : width,\r\n weightToDisplayEnd = scrollSize + height,\r\n totalLength = collection.length, typicalItemSize = dynamicSize ? this.getTypicalItemSize(isVertical, itemSize) || itemSize : itemSize,\r\n totalSize = dynamicSize ? this.getBoundsFromCache(collection, typicalItemSize, isVertical) : totalLength * typicalItemSize,\r\n snippedPos = Math.floor(scrollSize);\r\n\r\n let itemsFromStartToScrollEnd: number = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1,\r\n leftItemLength = 0, rightItemLength = 0,\r\n leftItemsWeight = 0, rightItemsWeight = 0, startIndex;\r\n\r\n if (dynamicSize) {\r\n let y = 0;\r\n for (let i = 0, l = collection.length; i < l; i++) {\r\n const collectionItem = collection[i], map = this._map;\r\n\r\n let itemSize = 0;\r\n if (map.has(collectionItem.id)) {\r\n const bounds = map.get(collectionItem.id);\r\n itemSize = bounds ? bounds[sizeProperty] : typicalItemSize;\r\n } else {\r\n itemSize = typicalItemSize;\r\n }\r\n\r\n if (itemsFromStartToScrollEnd === -1 && y >= scrollSize && y <= scrollSize + itemSize) {\r\n leftItemsWeight += itemSize;\r\n itemsFromStartToScrollEnd = i;\r\n }\r\n\r\n if (itemsFromStartToDisplayEnd === -1) {\r\n if (y >= weightToDisplayEnd && y <= weightToDisplayEnd + itemSize) {\r\n itemsFromStartToDisplayEnd = i;\r\n itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + itemsOffset;\r\n }\r\n } else {\r\n if (i <= itemsFromDisplayEndToOffsetEnd) {\r\n rightItemsWeight += itemSize;\r\n }\r\n }\r\n\r\n y += itemSize;\r\n }\r\n\r\n leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);\r\n rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength\r\n ? totalLength - itemsFromStartToDisplayEnd : itemsOffset;\r\n startIndex = itemsFromStartToScrollEnd - leftItemLength;\r\n } else {\r\n itemsFromStartToScrollEnd = Math.ceil(scrollSize / typicalItemSize);\r\n itemsFromStartToDisplayEnd = Math.ceil((scrollSize + size) / typicalItemSize);\r\n leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);\r\n rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength\r\n ? totalLength - itemsFromStartToDisplayEnd : itemsOffset;\r\n startIndex = itemsFromStartToScrollEnd - leftItemLength;\r\n leftItemsWeight = leftItemLength * typicalItemSize;\r\n rightItemsWeight = rightItemLength * typicalItemSize;\r\n }\r\n\r\n const leftHiddenItemsWeight = itemsFromStartToScrollEnd * typicalItemSize,\r\n totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * typicalItemSize,\r\n itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight\r\n\r\n const metrics = {\r\n itemsFromStartToScrollEnd,\r\n itemsFromStartToDisplayEnd,\r\n itemsOnDisplay,\r\n leftHiddenItemsWeight,\r\n leftItemLength,\r\n leftItemsWeight,\r\n rightItemLength,\r\n rightItemsWeight,\r\n snippedPos,\r\n totalItemsToDisplayEndWeight,\r\n totalSize,\r\n typicalItemSize,\r\n };\r\n\r\n return metrics;\r\n }\r\n\r\n /**\r\n * Calculates and returns the maximum size of a repeating item\r\n */\r\n getTypicalItemSize(isVertical: boolean, defaultItemSize: number, fromIndex: number = 0, to: number = -1) {\r\n const sizeProperty = isVertical ? 'height' : 'width',\r\n sizes: { [size: number]: number } = {};\r\n\r\n let maxRepeatingSize = defaultItemSize, count = 0;\r\n\r\n this._map.forEach(bound => {\r\n const size = bound[sizeProperty];\r\n if (sizes.hasOwnProperty(size)) {\r\n sizes[size] += 1;\r\n } else {\r\n sizes[size] = 1;\r\n }\r\n if (sizes[size] > count) {\r\n count = sizes[size];\r\n maxRepeatingSize = size;\r\n }\r\n });\r\n return maxRepeatingSize;\r\n }\r\n\r\n /**\r\n * tracking by propName\r\n */\r\n track(dynamicSize: boolean = false): void {\r\n if (!this._items || !this._displayComponents) {\r\n return;\r\n }\r\n\r\n this._tracker.track(this._items, this._displayComponents, dynamicSize ? (component, item) => {\r\n this.cacheElementBounds(component, item);\r\n } : undefined);\r\n }\r\n\r\n setDisplayObjectIndexMapById(v: { [id: number]: number }): void {\r\n this._tracker.displayObjectIndexMapById = v;\r\n }\r\n\r\n untrackComponentByIdProperty(component?: NgVirtualListItemComponent | undefined) {\r\n this._tracker.untrackComponentByIdProperty(component);\r\n }\r\n\r\n /**\r\n * Stores the element bounds in _sizeCacheMap\r\n */\r\n private cacheElementBounds(component: NgVirtualListItemComponent, item: IRenderVirtualListItem) {\r\n component.item = item;\r\n const bounds = component.getBounds();\r\n this.set(item.id, bounds);\r\n }\r\n\r\n /**\r\n * Returns calculated bounds from cache\r\n */\r\n private getBoundsFromCache(items: IVirtualListCollection, typicalItemSize: number, isVertical: boolean) {\r\n const sizeProperty = isVertical ? 'height' : 'width', map = this._map;\r\n let size: number = 0;\r\n for (let i = 0, l = items.length; i < l; i++) {\r\n const item = items[i];\r\n if (map.has(item.id)) {\r\n const bounds = map.get(item.id);\r\n size += bounds ? bounds[sizeProperty] : typicalItemSize;\r\n } else {\r\n size += typicalItemSize;\r\n }\r\n }\r\n return size;\r\n }\r\n\r\n override dispose() {\r\n super.dispose();\r\n\r\n this.clearchangesTimeouts();\r\n\r\n if (this._tracker) {\r\n this._tracker.dispose();\r\n }\r\n }\r\n}\r\n","import {\r\n AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, ElementRef, inject, input,\r\n OnDestroy, output, signal, TemplateRef, ViewChild, viewChild, ViewContainerRef, ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, of, switchMap, tap } from 'rxjs';\r\nimport { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';\r\nimport {\r\n DEFAULT_DIRECTION, DEFAULT_DYNAMIC_SIZE, DEFAULT_ITEM_SIZE, DEFAULT_ITEMS_OFFSET, DEFAULT_SNAP, DEFAULT_SNAP_TO_ITEM,\r\n TRACK_BY_PROPERTY_NAME,\r\n} from './const';\r\nimport { IVirtualListCollection, IVirtualListItem, IVirtualListStickyMap } from './models';\r\nimport { Id, IRect } from './types';\r\nimport { IRenderVirtualListCollection } from './models/render-collection.model';\r\nimport { IRenderVirtualListItem } from './models/render-item.model';\r\nimport { Direction, Directions } from './enums';\r\nimport { TrackBox, isDirection, toggleClassName, Tracker } from './utils';\r\n\r\n/**\r\n * Virtual list component.\r\n * Maximum performance for extremely large lists.\r\n * It is based on algorithms for virtualization of screen objects.\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\n@Component({\r\n selector: 'ng-virtual-list',\r\n imports: [CommonModule],\r\n templateUrl: './ng-virtual-list.component.html',\r\n styleUrl: './ng-virtual-list.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n})\r\nexport class NgVirtualListComponent implements AfterViewInit, OnDestroy {\r\n private static __nextId: number = 0;\r\n\r\n private _id: number = NgVirtualListComponent.__nextId;\r\n /**\r\n * Readonly. Returns the unique identifier of the component.\r\n */\r\n get id() { return this._id; }\r\n\r\n @ViewChild('renderersContainer', { read: ViewContainerRef })\r\n protected _listContainerRef: ViewContainerRef | undefined;\r\n\r\n protected _container = viewChild<ElementRef<HTMLDivElement>>('container');\r\n\r\n protected _list = viewChild<ElementRef<HTMLUListElement>>('list');\r\n\r\n /**\r\n * Fires when the list has been scrolled.\r\n */\r\n onScroll = output<Event | undefined>();\r\n\r\n /**\r\n * Fires when the list has completed scrolling.\r\n */\r\n onScrollEnd = output<Event | undefined>();\r\n\r\n /**\r\n * Collection of list items.\r\n */\r\n items = input.required<IVirtualListCollection>();\r\n\r\n /**\r\n * Determines whether elements will snap. Default value is \"true\".\r\n */\r\n snap = input<boolean>(DEFAULT_SNAP);\r\n\r\n /**\r\n * Determines whether scroll positions will be snapped to the element. Default value is \"false\".\r\n */\r\n snapToItem = input<boolean>(DEFAULT_SNAP_TO_ITEM);\r\n\r\n /**\r\n * Rendering element template.\r\n */\r\n itemRenderer = input.required<TemplateRef<any>>();\r\n\r\n /**\r\n * Dictionary zIndex by id of the list element. If the value is not set or equal to 0,\r\n * then a simple element is displayed, if the value is greater than 0, then the sticky position mode is enabled for the element.\r\n */\r\n stickyMap = input<IVirtualListStickyMap>({});\r\n\r\n /**\r\n * If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element.\r\n * Ignored if the dynamicSize property is true.\r\n */\r\n itemSize = input(DEFAULT_ITEM_SIZE);\r\n\r\n /**\r\n * If true then the items in the list can have different sizes and the itemSize property is ignored.\r\n * If false then the items in the list have a fixed size specified by the itemSize property. The default value is false.\r\n */\r\n dynamicSize = input(DEFAULT_DYNAMIC_SIZE);\r\n\r\n /**\r\n * Determines the direction in which elements are placed. Default value is \"vertical\".\r\n */\r\n direction = input<Direction>(DEFAULT_DIRECTION);\r\n\r\n /**\r\n * Number of elements outside the scope of visibility. Default value is 2.\r\n */\r\n itemsOffset = input<number>(DEFAULT_ITEMS_OFFSET);\r\n\r\n private _isVertical = this.getIsVertical();\r\n\r\n protected _displayItems = signal<IRenderVirtualListCollection | null>(null);\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> = [];\r\n\r\n protected _bounds = signal<DOMRect | null>(null);\r\n\r\n protected _scrollSize = signal<number>(0);\r\n\r\n private _resizeObserver: ResizeObserver | null = null;\r\n\r\n private _onResizeHandler = () => {\r\n this._bounds.set(this._container()?.nativeElement?.getBoundingClientRect() ?? null);\r\n }\r\n\r\n private _onScrollHandler = (e: Event) => {\r\n const target = e.target as HTMLDivElement,\r\n scrollSize = this._isVertical ? target.scrollTop : target.scrollLeft;\r\n\r\n this._scrollSize.set(scrollSize);\r\n\r\n this.onScroll.emit(e);\r\n }\r\n\r\n private _onScrollEndHandler = (e: Event) => {\r\n const target = e.target as HTMLDivElement, s = this.itemSize(), itemSize = s < 0 ? DEFAULT_ITEM_SIZE : s,\r\n snapToItem = this.snapToItem(), scrollSize = this._isVertical ? target.scrollTop : target.scrollLeft,\r\n scrollItems = Math.round(scrollSize / itemSize), actualScrollSize = snapToItem ? scrollItems * itemSize : scrollSize;\r\n\r\n if (target.scrollTop !== actualScrollSize) {\r\n const container = target, params: ScrollToOptions = { [this._isVertical ? 'top' : 'left']: actualScrollSize, behavior: 'instant' };\r\n\r\n container.scroll(params);\r\n }\r\n\r\n this.onScrollEnd.emit(e);\r\n }\r\n\r\n private _elementRef = inject(ElementRef<HTMLDivElement>);\r\n\r\n private _initialized = signal<boolean>(false);\r\n\r\n /**\r\n * Dictionary of element sizes by their id\r\n */\r\n private _trackBox = new TrackBox(TRACK_BY_PROPERTY_NAME);\r\n\r\n private _onTrackBoxChangeHandler = (v: number) => {\r\n this._$cacheVersion.next(v);\r\n }\r\n\r\n private _$cacheVersion = new BehaviorSubject<number>(-1);\r\n get $cacheVersion() { return this._$cacheVersion.asObservable(); }\r\n\r\n constructor() {\r\n NgVirtualListComponent.__nextId = NgVirtualListComponent.__nextId + 1 === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListComponent.__nextId + 1;\r\n this._id = NgVirtualListComponent.__nextId;\r\n\r\n this._trackBox.displayComponents = this._displayComponents;\r\n\r\n const $bounds = toObservable(this._bounds).pipe(\r\n filter(b => !!b),\r\n ), $items = toObservable(this.items).pipe(\r\n map(i => !i ? [] : i),\r\n ), $scrollSize = toObservable(this._scrollSize),\r\n $itemSize = toObservable(this.itemSize).pipe(\r\n map(v => v <= 0 ? DEFAULT_ITEM_SIZE : v),\r\n ),\r\n $itemsOffset = toObservable(this.itemsOffset).pipe(\r\n map(v => v < 0 ? DEFAULT_ITEMS_OFFSET : v),\r\n ),\r\n $stickyMap = toObservable(this.stickyMap).pipe(\r\n map(v => !v ? {} : v),\r\n ),\r\n $snap = toObservable(this.snap),\r\n $isVertical = toObservable(this.direction).pipe(\r\n map(v => this.getIsVertical(v || DEFAULT_DIRECTION)),\r\n ),\r\n $dynamicSize = toObservable(this.dynamicSize),\r\n $cacheVersion = this.$cacheVersion,\r\n $displayItems = toObservable(this._displayItems),\r\n $initialized = toObservable(this._initialized);\r\n\r\n $isVertical.pipe(\r\n takeUntilDestroyed(),\r\n tap(v => {\r\n this._isVertical = v;\r\n const el: HTMLElement = this._elementRef.nativeElement;\r\n toggleClassName(el, v ? 'vertical' : 'horizontal', true);\r\n }),\r\n ).subscribe();\r\n\r\n $dynamicSize.pipe(\r\n takeUntilDestroyed(),\r\n tap(dynamicSize => {\r\n if (dynamicSize) {\r\n if (!this._trackBox.hasEventListener('change', this._onTrackBoxChangeHandler)) {\r\n this._trackBox.addEventListener('change', this._onTrackBoxChangeHandler);\r\n }\r\n } else {\r\n if (this._trackBox.hasEventListener('change', this._onTrackBoxChangeHandler)) {\r\n this._trackBox.removeEventListener('change', this._onTrackBoxChangeHandler);\r\n }\r\n }\r\n })\r\n ).subscribe();\r\n\r\n $displayItems.pipe(\r\n takeUntilDestroyed(),\r\n tap((displayItems) => {\r\n this._trackBox.items = displayItems;\r\n })\r\n ).subscribe();\r\n\r\n combineLatest([$initialized, $bounds, $items, $stickyMap, $scrollSize, $itemSize,\r\n $itemsOffset, $snap, $isVertical, $dynamicSize, $cacheVersion,\r\n ]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n switchMap(([,\r\n bounds, items, stickyMap, scrollSize, itemSize,\r\n itemsOffset, snap, isVertical, dynamicSize, cacheVersion,\r\n ]) => {\r\n const { width, height } = bounds,\r\n {\r\n itemsFromStartToScrollEnd,\r\n itemsOnDisplay,\r\n leftHiddenItemsWeight,\r\n leftItemLength,\r\n leftItemsWeight,\r\n rightItemsWeight,\r\n snippedPos,\r\n totalSize,\r\n typicalItemSize,\r\n } = this._trackBox.recalculateMetrics({\r\n bounds: { width, height }, collection: items,\r\n dynamicSize, isVertical, itemSize, itemsOffset, scrollSize, snap,\r\n });\r\n\r\n // Нужно сперва сделать корректные расчеты для dynamicSize. Сейчас количества элементов в облостях высчитывается не корректно!\r\n // Необходима кореляция startDisplayObjectY с помощью дельты от высоты предыдущей и текущей размеченной области по версии кэша.\r\n // TrackBox может расчитать дельту!\r\n\r\n return of({\r\n items, stickyMap, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd,\r\n itemsOnDisplay, leftHiddenItemsWeight, itemSize: typicalItemSize, totalSize, snap,\r\n leftItemLength, leftItemsWeight, rightItemsWeight, snippedPos, dynamicSize,\r\n });\r\n }),\r\n tap(({\r\n items, stickyMap, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd,\r\n itemsOnDisplay, leftHiddenItemsWeight, leftItemLength, leftItemsWeight, rightItemsWeight,\r\n snippedPos, itemSize, totalSize, snap, dynamicSize: dynamic,\r\n }) => {\r\n const displayItems: IRenderVirtualListCollection = [];\r\n if (items.length) {\r\n const sizeProperty = isVertical ? 'height' : 'width',\r\n w = isVertical ? width : itemSize, h = isVertical ? itemSize : height, totalItems = items.length,\r\n startIndex = itemsFromStartToScrollEnd - leftItemLength;\r\n\r\n let pos = leftHiddenItemsWeight - leftItemsWeight,\r\n renderWeight = itemsOnDisplay + leftItemsWeight + rightItemsWeight,\r\n stickyItem: IRenderVirtualListItem | undefined, nextSticky: IRenderVirtualListItem | undefined, stickyItemIndex = -1,\r\n stickyItemSize = 0;\r\n\r\n if (snap) {\r\n for (let i = itemsFromStartToScrollEnd - 1; i >= 0; i--) {\r\n const id = items[i].id, sticky = stickyMap[id];\r\n stickyItemSize = dynamic ? this._trackBox.get(id)?.[sizeProperty] || itemSize : itemSize;\r\n if (sticky > 0) {\r\n const measures = {\r\n x: isVertical ? 0 : snippedPos,\r\n y: isVertical ? snippedPos : 0,\r\n width: w,\r\n height: h,\r\n }, config = {\r\n isVertical,\r\n sticky,\r\n snap,\r\n snapped: true,\r\n dynamic,\r\n };\r\n\r\n const itemData: IVirtualListItem = items[i];\r\n\r\n stickyItem = { id, measures, data: itemData, config };\r\n stickyItemIndex = i;\r\n\r\n displayItems.push(stickyItem);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let i = startIndex;\r\n\r\n while (renderWeight > 0) {\r\n if (i >= totalItems) {\r\n break;\r\n }\r\n\r\n const id = items[i].id, size = dynamic ? this._trackBox.get(id)?.[sizeProperty] || itemSize : itemSize;\r\n\r\n if (id !== stickyItem?.id) {\r\n const snaped = snap && stickyMap[id] > 0 && pos <= scrollSize,\r\n measures = {\r\n x: isVertical ? 0 : pos,\r\n y: isVertical ? pos : 0,\r\n width: w,\r\n height: h,\r\n }, config = {\r\n isVertical,\r\n sticky: stickyMap[id],\r\n snap,\r\n snapped: false,\r\n dynamic,\r\n };\r\n\r\n const itemData: IVirtualListItem = items[i];\r\n\r\n const item: IRenderVirtualListItem = { id, measures, data: itemData, config };\r\n if (!nextSticky && stickyItemIndex < i && snap && stickyMap[id] > 0 && pos <= scrollSize + size) {\r\n item.measures.x = isVertical ? 0 : snaped ? snippedPos : pos;\r\n item.measures.y = isVertical ? snaped ? snippedPos : pos : 0;\r\n nextSticky = item;\r\n }\r\n\r\n displayItems.push(item);\r\n }\r\n\r\n renderWeight -= size;\r\n pos += size;\r\n i++;\r\n }\r\n\r\n const axis = isVertical ? 'y' : 'x';\r\n\r\n if (nextSticky && stickyItem && nextSticky.measures[axis] <= scrollSize + stickyItemSize) {\r\n if (nextSticky.measures[axis] > scrollSize) {\r\n stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItemSize;\r\n stickyItem.config.snapped = nextSticky.config.snapped = false;\r\n stickyItem.config.sticky = 1;\r\n } else {\r\n nextSticky.config.snapped = true;\r\n }\r\n }\r\n }\r\n\r\n this._displayItems.set(displayItems);\r\n\r\n this.resetBoundsSize(isVertical, totalSize);\r\n })\r\n ).subscribe();\r\n\r\n combineLatest([$initialized, toObservable(this.itemRenderer)]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n tap(([, itemRenderer]) => {\r\n this.resetRenderers(itemRenderer);\r\n })\r\n )\r\n\r\n combineLatest([$initialized, $displayItems]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n tap(([, displayItems]) => {\r\n this.createDisplayComponentsIfNeed(displayItems);\r\n this.tracking();\r\n }),\r\n ).subscribe();\r\n }\r\n\r\n ngOnInit() {\r\n this._initialized.set(true);\r\n }\r\n\r\n private getIsVertical(d?: Direction) {\r\n const dir = d || this.direction();\r\n return isDirection(dir, Directions.VERTICAL);\r\n }\r\n\r\n private createDisplayComponentsIfNeed(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems || !this._listContainerRef) {\r\n this._trackBox.setDisplayObjectIndexMapById({});\r\n return;\r\n }\r\n const _listContainerRef = this._listContainerRef;\r\n\r\n while (this._displayComponents.length < displayItems.length) {\r\n if (_listContainerRef) {\r\n const comp = _listContainerRef.createComponent(NgVirtualListItemComponent);\r\n this._displayComponents.push(comp);\r\n }\r\n }\r\n\r\n const maxLength = displayItems.length;\r\n while (this._displayComponents.length > maxLength) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n const id = comp?.instance.item?.id;\r\n if (id !== undefined) {\r\n this._trackBox.untrackComponentByIdProperty(comp?.instance);\r\n }\r\n }\r\n\r\n this.resetRenderers();\r\n }\r\n\r\n private resetRenderers(itemRenderer?: TemplateRef<any>) {\r\n const doMap: { [id: number]: number } = {};\r\n for (let i = 0, l = this._displayComponents.length; i < l; i++) {\r\n const item = this._displayComponents[i];\r\n item.instance.renderer = itemRenderer || this.itemRenderer();\r\n doMap[item.instance.id] = i;\r\n }\r\n\r\n this._trackBox.setDisplayObjectIndexMapById(doMap);\r\n }\r\n\r\n /**\r\n * tracking by id\r\n */\r\n protected tracking() {\r\n this._trackBox.track(this.dynamicSize());\r\n }\r\n\r\n private resetBoundsSize(isVertical: boolean, totalSize: number) {\r\n const l = this._list();\r\n if (l) {\r\n l.nativeElement.style[isVertical ? 'height' : 'width'] = `${totalSize}px`;\r\n }\r\n }\r\n\r\n /**\r\n * The method scrolls the list to the element with the given id and returns the value of the scrolled area.\r\n * Behavior accepts the values \"auto\", \"instant\" and \"smooth\".\r\n */\r\n scrollTo(id: Id, behavior: ScrollBehavior = 'auto') {\r\n const items = this.items();\r\n if (!items || !items.length) {\r\n return;\r\n }\r\n\r\n const index = items.findIndex(item => item.id === id), scrollSize = index * this.itemSize(), container = this._container();\r\n if (container) {\r\n const params: ScrollToOptions = { [this._isVertical ? 'top' : 'left']: scrollSize, behavior };\r\n container.nativeElement.scroll(params);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n containerEl.nativeElement.addEventListener('scroll', this._onScrollHandler);\r\n containerEl.nativeElement.addEventListener('scrollend', this._onScrollEndHandler);\r\n\r\n this._resizeObserver = new ResizeObserver(this._onResizeHandler);\r\n this._resizeObserver.observe(containerEl.nativeElement);\r\n\r\n this._onResizeHandler();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this._trackBox) {\r\n this._trackBox.dispose();\r\n }\r\n\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n containerEl.nativeElement.removeEventListener('scroll', this._onScrollHandler);\r\n containerEl.nativeElement.removeEventListener('scrollend', this._onScrollEndHandler);\r\n\r\n if (this._resizeObserver) {\r\n this._resizeObserver.unobserve(containerEl.nativeElement);\r\n }\r\n }\r\n\r\n if (this._displayComponents) {\r\n while (this._displayComponents.length > 0) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n }\r\n }\r\n}\r\n","<div #container part=\"scroller\" class=\"ngvl__container\">\r\n <ul #list part=\"list\" class=\"ngvl__list\">\r\n <ng-container #renderersContainer></ng-container>\r\n </ul>\r\n</div>","/*\r\n * Public API Surface of ng-virtual-list\r\n */\r\n\r\nexport * from './lib/ng-virtual-list.component';\r\nexport * from './lib/models';\r\nexport * from './lib/types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-virtual-list.mjs","sources":["../../../projects/ng-virtual-list/src/lib/enums/directions.ts","../../../projects/ng-virtual-list/src/lib/const/index.ts","../../../projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.ts","../../../projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.html","../../../projects/ng-virtual-list/src/lib/utils/isDirection.ts","../../../projects/ng-virtual-list/src/lib/utils/debounce.ts","../../../projects/ng-virtual-list/src/lib/utils/toggleClassName.ts","../../../projects/ng-virtual-list/src/lib/utils/tracker.ts","../../../projects/ng-virtual-list/src/lib/utils/eventEmitter.ts","../../../projects/ng-virtual-list/src/lib/utils/cacheMap.ts","../../../projects/ng-virtual-list/src/lib/utils/trackBox.ts","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts","../../../projects/ng-virtual-list/src/lib/ng-virtual-list.component.html","../../../projects/ng-virtual-list/src/public-api.ts","../../../projects/ng-virtual-list/src/ng-virtual-list.ts"],"sourcesContent":["export enum Directions {\r\n HORIZONTAL = 'horizontal',\r\n VERTICAL = 'vertical',\r\n}","import { Directions } from \"../enums/directions\";\r\n\r\nexport const DEFAULT_ITEM_SIZE = 24;\r\n\r\nexport const DEFAULT_ITEMS_OFFSET = 2;\r\n\r\nexport const DEFAULT_LIST_SIZE = 400;\r\n\r\nexport const DEFAULT_SNAP = false;\r\n\r\nexport const DEFAULT_SNAP_TO_ITEM = false;\r\n\r\nexport const DEFAULT_DYNAMIC_SIZE = false;\r\n\r\nexport const TRACK_BY_PROPERTY_NAME = 'id';\r\n\r\nexport const DEFAULT_DIRECTION = Directions.VERTICAL;\r\n\r\nexport const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;\r\n\r\n// presets\r\n\r\nexport const BEHAVIOR_INSTANT = 'instant';\r\n\r\nexport const BEHAVIOR_AUTO = 'auto';\r\n\r\nexport const VISIBILITY_VISIBLE = 'visible';\r\n\r\nexport const VISIBILITY_HIDDEN = 'hidden';\r\n\r\nexport const SIZE_100_PERSENT = '100%';\r\n\r\nexport const SIZE_AUTO = 'auto';\r\n\r\nexport const POSITION_ABSOLUTE = 'absolute';\r\n\r\nexport const POSITION_STICKY = 'sticky';\r\n\r\nexport const TRANSLATE_3D = 'translate3d';\r\n\r\nexport const ZEROS_TRANSLATE_3D = `${TRANSLATE_3D}(0,0,0)`;\r\n\r\nexport const TOP_PROP_NAME = 'top';\r\n\r\nexport const LEFT_PROP_NAME = 'left';\r\n\r\nexport const X_PROP_NAME = 'x';\r\n\r\nexport const Y_PROP_NAME = 'y';\r\n\r\nexport const WIDTH_PROP_NAME = 'width';\r\n\r\nexport const HEIGHT_PROP_NAME = 'height';\r\n\r\nexport const PX = 'px';\r\n\r\nexport const SCROLL = 'scroll';\r\n\r\nexport const SCROLL_END = 'scrollend';\r\n\r\nexport const CLASS_LIST_VERTICAL = 'vertical';\r\n\r\nexport const CLASS_LIST_HORIZONTAL = 'horizontal';\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, ElementRef, inject, signal, TemplateRef } from '@angular/core';\r\nimport { IRenderVirtualListItem } from '../models/render-item.model';\r\nimport { IRect } from '../types';\r\nimport {\r\n POSITION_ABSOLUTE, POSITION_STICKY, PX, SIZE_100_PERSENT, SIZE_AUTO, TRANSLATE_3D, VISIBILITY_HIDDEN,\r\n VISIBILITY_VISIBLE, ZEROS_TRANSLATE_3D,\r\n} from '../const';\r\n\r\n/**\r\n * Virtual list item component\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\n@Component({\r\n selector: 'ng-virtual-list-item',\r\n imports: [CommonModule],\r\n templateUrl: './ng-virtual-list-item.component.html',\r\n styleUrl: './ng-virtual-list-item.component.scss',\r\n host: {\r\n 'class': 'ngvl__item',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgVirtualListItemComponent {\r\n private static __nextId: number = 0;\r\n\r\n private _id!: number;\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n data = signal<IRenderVirtualListItem | undefined>(undefined);\r\n private _data: IRenderVirtualListItem | undefined = undefined;\r\n set item(v: IRenderVirtualListItem | undefined) {\r\n if (this._data === v) {\r\n return;\r\n }\r\n\r\n const data = this._data = v;\r\n\r\n if (data) {\r\n const styles = this._elementRef.nativeElement.style;\r\n styles.zIndex = data.config.sticky;\r\n if (data.config.snapped) {\r\n styles.transform = ZEROS_TRANSLATE_3D;\r\n styles.position = POSITION_STICKY;\r\n } else {\r\n styles.position = POSITION_ABSOLUTE;\r\n styles.transform = `${TRANSLATE_3D}(${data.config.isVertical ? 0 : data.measures.x}${PX}, ${data.config.isVertical ? data.measures.y : 0}${PX} , 0)`;\r\n }\r\n styles.height = data.config.isVertical ? data.config.dynamic ? SIZE_AUTO : `${data.measures.height}${PX}` : SIZE_100_PERSENT;\r\n styles.width = data.config.isVertical ? SIZE_100_PERSENT : data.config.dynamic ? SIZE_AUTO : `${data.measures.width}${PX}`;\r\n }\r\n\r\n this.data.set(v);\r\n }\r\n\r\n get itemId() {\r\n return this._data?.id;\r\n }\r\n\r\n itemRenderer = signal<TemplateRef<any> | undefined>(undefined);\r\n\r\n set renderer(v: TemplateRef<any> | undefined) {\r\n this.itemRenderer.set(v);\r\n }\r\n\r\n private _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n constructor() {\r\n this._id = NgVirtualListItemComponent.__nextId = NgVirtualListItemComponent.__nextId === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListItemComponent.__nextId + 1;\r\n }\r\n\r\n getBounds(): IRect {\r\n const el: HTMLElement = this._elementRef.nativeElement,\r\n { width, height, left, top } = el.getBoundingClientRect();\r\n return { width, height, x: left, y: top };\r\n }\r\n\r\n showIfNeed() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === VISIBILITY_VISIBLE) {\r\n return;\r\n }\r\n\r\n styles.visibility = VISIBILITY_VISIBLE;\r\n }\r\n\r\n hide() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === VISIBILITY_HIDDEN) {\r\n return;\r\n }\r\n\r\n styles.visibility = VISIBILITY_HIDDEN;\r\n }\r\n}\r\n","@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem part=\"item\" class=\"ngvl-item__container\">\r\n @if (renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\" [ngTemplateOutletContext]=\"{data: item.data || {}}\" />\r\n }\r\n</li>\r\n}","import { Direction, Directions } from \"../enums\";\r\n\r\nconst HORIZONTAL_ALIASES = [Directions.HORIZONTAL, 'horizontal'],\r\n VERTICAL_ALIASES = [Directions.VERTICAL, 'vertical']\r\n ;\r\n\r\nexport const isDirection = (src: Direction, expected: Direction): boolean => {\r\n if (HORIZONTAL_ALIASES.includes(expected)) {\r\n return HORIZONTAL_ALIASES.includes(src);\r\n }\r\n return VERTICAL_ALIASES.includes(src);\r\n}","/**\r\n * Simple debounce function.\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport const debounce = (cb: (...args: Array<any>) => void, debounceTime: number = 0) => {\r\n let timeout: any;\r\n const dispose = () => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n const execute = (...args: Array<any>) => {\r\n dispose();\r\n\r\n timeout = setTimeout(() => {\r\n cb(...args);\r\n }, debounceTime);\r\n };\r\n return {\r\n execute,\r\n dispose,\r\n };\r\n};\r\n","export const toggleClassName = (el: HTMLElement, className: string, remove = false) => {\r\n if (!el.classList.contains(className)) {\r\n el.classList.add(className);\r\n } else if (remove) {\r\n el.classList.remove(className);\r\n }\r\n};\r\n","import { ComponentRef } from \"@angular/core\";\r\n\r\ntype TrackingPropertyId = string | number;\r\n\r\n/**\r\n * Tracks display items by property\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class Tracker<I = any, C = { [prop: string]: any; }> {\r\n /**\r\n * display objects dictionary of indexes by id\r\n */\r\n private _displayObjectIndexMapById: { [id: number]: number } = {};\r\n\r\n set displayObjectIndexMapById(v: { [id: number]: number }) {\r\n if (this._displayObjectIndexMapById === v) {\r\n return;\r\n }\r\n\r\n this._displayObjectIndexMapById = v;\r\n }\r\n\r\n get displayObjectIndexMapById() {\r\n return this._displayObjectIndexMapById;\r\n }\r\n\r\n /**\r\n * Dictionary displayItems propertyNameId by items propertyNameId\r\n */\r\n private _trackMap: { [id: TrackingPropertyId]: number } | null = {};\r\n\r\n get trackMap() {\r\n return this._trackMap;\r\n }\r\n\r\n private _trackingPropertyName!: string;\r\n\r\n constructor(trackingPropertyName: string) {\r\n this._trackingPropertyName = trackingPropertyName;\r\n }\r\n\r\n /**\r\n * tracking by propName\r\n */\r\n track(items: Array<any>, components: Array<ComponentRef<any>>,\r\n afterComponentSetup?: (component: C, item: I) => void): void {\r\n if (!items) {\r\n return;\r\n }\r\n\r\n const idPropName = this._trackingPropertyName, untrackedItems = [...components];\r\n\r\n for (let i = 0, l = items.length; i < l; i++) {\r\n const item = items[i], itemTrackingProperty = item[idPropName];\r\n\r\n if (this._trackMap) {\r\n const diId = this._trackMap[itemTrackingProperty];\r\n if (this._trackMap.hasOwnProperty(itemTrackingProperty)) {\r\n const lastIndex = this._displayObjectIndexMapById[diId], el = components[lastIndex];\r\n\r\n this._checkComponentProperty(el?.instance);\r\n\r\n const elId = el?.instance?.[itemTrackingProperty];\r\n if (el && elId === diId) {\r\n const indexByUntrackedItems = untrackedItems.findIndex(v => {\r\n this._checkComponentProperty(v.instance);\r\n\r\n return v.instance[itemTrackingProperty] === elId;\r\n });\r\n if (indexByUntrackedItems > -1) {\r\n el.instance.item = item;\r\n\r\n if (afterComponentSetup !== undefined) {\r\n afterComponentSetup(el.instance, item);\r\n }\r\n\r\n untrackedItems.splice(indexByUntrackedItems, 1);\r\n continue;\r\n }\r\n }\r\n delete this._trackMap[itemTrackingProperty];\r\n }\r\n }\r\n\r\n if (untrackedItems.length > 0) {\r\n const el = untrackedItems.shift(), item = items[i];\r\n if (el) {\r\n el.instance.item = item;\r\n\r\n if (this._trackMap) {\r\n this._checkComponentProperty(el.instance);\r\n\r\n this._trackMap[itemTrackingProperty] = el.instance[itemTrackingProperty];\r\n }\r\n\r\n if (afterComponentSetup !== undefined) {\r\n afterComponentSetup(el.instance, item);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (untrackedItems.length) {\r\n throw Error('Tracking by id caused an error.')\r\n }\r\n }\r\n\r\n untrackComponentByIdProperty(component?: C): void {\r\n if (!component) {\r\n return;\r\n }\r\n\r\n const propertyIdName = this._trackingPropertyName;\r\n\r\n this._checkComponentProperty(component);\r\n\r\n if (this._trackMap && (component as any)[propertyIdName] !== undefined) {\r\n delete this._trackMap[propertyIdName];\r\n }\r\n }\r\n\r\n private _checkComponentProperty(component?: C): void {\r\n if (!component) {\r\n return;\r\n }\r\n\r\n const propertyIdName = this._trackingPropertyName;\r\n\r\n try {\r\n (component as any)[propertyIdName];\r\n } catch (err) {\r\n throw Error(`Property ${propertyIdName} does not exist.`);\r\n }\r\n }\r\n\r\n dispose() {\r\n this._trackMap = null;\r\n }\r\n}","export type TEventHandler = (...args: Array<any>) => void;\r\n\r\n/**\r\n * Simple event emitter\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class EventEmitter<E = string, H = TEventHandler> {\r\n private _listeners: {\r\n [eventName: string]: Array<TEventHandler>,\r\n } = {};\r\n\r\n protected _disposed: boolean = false;\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Emits the event\r\n */\r\n dispatch(event: E, ...args: Array<any>): void {\r\n const ctx = this;\r\n const listeners = this._listeners[event as string];\r\n if (Array.isArray(listeners)) {\r\n for (let i = 0, l = listeners.length; i < l; i++) {\r\n const listener = listeners[i];\r\n if (listener) {\r\n listener.apply(ctx, args);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Emits the event async\r\n */\r\n dispatchAsync(event: E, ...args: Array<any>): void {\r\n queueMicrotask(() => {\r\n if (this._disposed) {\r\n return;\r\n }\r\n this.dispatch(event, ...args);\r\n });\r\n }\r\n\r\n /**\r\n * Returns true if the event listener is already subscribed.\r\n */\r\n hasEventListener(eventName: E, handler: H): boolean {\r\n const event = eventName as string;\r\n if (this._listeners.hasOwnProperty(event)) {\r\n const listeners = this._listeners[event];\r\n const index = listeners.findIndex(v => v === handler);\r\n if (index > -1) {\r\n return true;\r\n }\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * Add event listener\r\n */\r\n addEventListener(eventName: E, handler: H): void {\r\n const event = eventName as string;\r\n if (!this._listeners.hasOwnProperty(event)) {\r\n this._listeners[event] = [];\r\n }\r\n this._listeners[event].push(handler as TEventHandler);\r\n }\r\n\r\n /**\r\n * Remove event listener\r\n */\r\n removeEventListener(eventName: E, handler: H): void {\r\n const event = eventName as string;\r\n if (!this._listeners.hasOwnProperty(event)) {\r\n return;\r\n }\r\n const listeners = this._listeners[event], index = listeners.findIndex(v => v === handler);\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n\r\n if (listeners.length === 0) {\r\n delete this._listeners[event];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all listeners\r\n */\r\n removeAllListeners() {\r\n const events = Object.keys(this._listeners);\r\n while (events.length > 0) {\r\n const event = events.pop();\r\n if (event) {\r\n const listeners = this._listeners[event];\r\n if (Array.isArray(listeners)) {\r\n while (listeners.length > 0) {\r\n const listener = listeners.pop();\r\n if (listener) {\r\n this.removeEventListener(event as E, listener as H);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n dispose() {\r\n this._disposed = true;\r\n\r\n this.removeAllListeners();\r\n }\r\n}","import { EventEmitter } from \"./eventEmitter\";\r\n\r\nexport interface ICacheMap<I = any, B = any> {\r\n set: (id: I, bounds: B) => Map<I, B>;\r\n has: (id: I) => boolean;\r\n get: (id: I) => B | undefined;\r\n forEach: (callbackfn: (value: B, key: I, map: Map<I, B>) => void, thisArg?: any) => void;\r\n}\r\n\r\ntype CacheMapEvents = 'change';\r\n\r\ntype OnChangeEventListener = (version: number) => void;\r\n\r\ntype CacheMapListeners = OnChangeEventListener;\r\n\r\n/**\r\n * Cache map.\r\n * Emits a change event on each mutation.\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class CacheMap<I = string | number, B = any, E = CacheMapEvents, L = CacheMapListeners> extends EventEmitter<E, L> implements ICacheMap {\r\n protected _map = new Map<I, B>();\r\n\r\n protected _version: number = 0;\r\n\r\n get version() {\r\n return this._version;\r\n }\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected bumpVersion() {\r\n this._version = this._version === Number.MAX_SAFE_INTEGER ? 0 : this._version + 1;\r\n }\r\n\r\n protected fireChange() {\r\n this.dispatch('change' as E, this.version);\r\n }\r\n\r\n set(id: I, bounds: B): Map<I, B> {\r\n if (this._map.has(id) && JSON.stringify(this._map.get(id)) === JSON.stringify(bounds)) {\r\n return this._map;\r\n }\r\n\r\n const v = this._map.set(id, bounds);\r\n\r\n this.bumpVersion();\r\n\r\n this.fireChange();\r\n\r\n return v;\r\n }\r\n\r\n has(id: I): boolean {\r\n return this._map.has(id);\r\n }\r\n\r\n get(id: I): B | undefined {\r\n return this._map.get(id);\r\n }\r\n\r\n forEach(callbackfn: (value: B, key: I, map: Map<I, B>) => void, thisArg?: any): void {\r\n return this._map.forEach(callbackfn, thisArg);\r\n }\r\n\r\n override dispose() {\r\n super.dispose();\r\n\r\n this._map.clear();\r\n }\r\n}","import { ComponentRef } from \"@angular/core\";\r\nimport { NgVirtualListItemComponent } from \"../components/ng-virtual-list-item.component\";\r\nimport { IVirtualListCollection } from \"../models/collection.model\";\r\nimport { IRenderVirtualListCollection } from \"../models/render-collection.model\";\r\nimport { IRenderVirtualListItem } from \"../models/render-item.model\";\r\nimport { Id } from \"../types/id\";\r\nimport { IRect } from \"../types/rect\";\r\nimport { CacheMap } from \"./cacheMap\";\r\nimport { Tracker } from \"./tracker\";\r\nimport { ISize } from \"../types\";\r\nimport { debounce } from \"./debounce\";\r\nimport { HEIGHT_PROP_NAME, WIDTH_PROP_NAME } from \"../const\";\r\n\r\nexport const TRACK_BOX_CHANGE_EVENT_NAME = 'change';\r\n\r\nexport interface IMetrics {\r\n itemsFromStartToScrollEnd: number;\r\n itemsFromStartToDisplayEnd: number;\r\n itemsOnDisplay: number;\r\n itemsOnDisplayLength: number;\r\n leftHiddenItemsWeight: number;\r\n leftItemLength: number;\r\n leftItemsWeight: number;\r\n rightItemLength: number;\r\n rightItemsWeight: number;\r\n snippedPos: number;\r\n totalItemsToDisplayEndWeight: number;\r\n totalSize: number;\r\n typicalItemSize: number;\r\n}\r\n\r\ninterface IRecalculateMetricsOptions {\r\n bounds: ISize;\r\n collection: IVirtualListCollection;\r\n isVertical: boolean;\r\n itemSize: number;\r\n itemsOffset: number;\r\n dynamicSize: boolean;\r\n scrollSize: number;\r\n snap: boolean;\r\n}\r\n\r\ntype CacheMapEvents = typeof TRACK_BOX_CHANGE_EVENT_NAME;\r\n\r\ntype OnChangeEventListener = (version: number) => void;\r\n\r\ntype CacheMapListeners = OnChangeEventListener;\r\n\r\n/**\r\n * An object that performs tracking, calculations and caching.\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\nexport class TrackBox extends CacheMap<Id, IRect, CacheMapEvents, CacheMapListeners> {\r\n protected _tracker!: Tracker<IRenderVirtualListItem, NgVirtualListItemComponent>;\r\n\r\n protected _items: IRenderVirtualListCollection | null | undefined;\r\n\r\n set items(v: IRenderVirtualListCollection | null | undefined) {\r\n if (this._items === v) {\r\n return;\r\n }\r\n\r\n this._items = v;\r\n }\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined;\r\n\r\n set displayComponents(v: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined) {\r\n if (this._displayComponents === v) {\r\n return;\r\n }\r\n\r\n this._displayComponents = v;\r\n }\r\n\r\n constructor(trackingPropertyName: string) {\r\n super();\r\n\r\n this._tracker = new Tracker(trackingPropertyName);\r\n }\r\n\r\n override set(id: Id, bounds: IRect): Map<Id, IRect> {\r\n if (this._map.has(id) && JSON.stringify(this._map.get(id)) === JSON.stringify(bounds)) {\r\n return this._map;\r\n }\r\n\r\n const v = this._map.set(id, bounds);\r\n\r\n this.bumpVersion();\r\n\r\n this.fireChange();\r\n\r\n return v;\r\n }\r\n\r\n private _fireChanges = (version: number) => {\r\n this.dispatch(TRACK_BOX_CHANGE_EVENT_NAME, version);\r\n };\r\n\r\n private _debounceChanges = debounce(this._fireChanges, 0);\r\n\r\n protected override fireChange() {\r\n this._debounceChanges.execute(this._version);\r\n }\r\n\r\n recalculateMetrics(options: IRecalculateMetricsOptions): IMetrics {\r\n const { bounds, collection, dynamicSize, isVertical, itemSize, itemsOffset, scrollSize, snap, } = options;\r\n\r\n const { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width,\r\n weightToDisplayEnd = scrollSize + height,\r\n totalLength = collection.length, typicalItemSize = itemSize,\r\n totalSize = dynamicSize ? this.getBoundsFromCache(collection, typicalItemSize, isVertical) : totalLength * typicalItemSize,\r\n snippedPos = Math.floor(scrollSize),\r\n leftItemsWeights: Array<number> = [];\r\n\r\n let itemsFromStartToScrollEnd: number = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1,\r\n leftItemLength = 0, rightItemLength = 0,\r\n leftItemsWeight = 0, rightItemsWeight = 0,\r\n leftHiddenItemsWeight = 0,\r\n totalItemsToDisplayEndWeight = 0,\r\n startIndex;\r\n\r\n if (dynamicSize) {\r\n let y = 0;\r\n for (let i = 0, l = collection.length; i < l; i++) {\r\n const ii = i + 1, collectionItem = collection[i], map = this._map;\r\n\r\n let componentSize = 0;\r\n if (map.has(collectionItem.id)) {\r\n const bounds = map.get(collectionItem.id);\r\n componentSize = bounds ? bounds[sizeProperty] : typicalItemSize;\r\n } else {\r\n componentSize = typicalItemSize;\r\n }\r\n\r\n if (y < scrollSize - componentSize) {\r\n leftItemsWeights.push(componentSize);\r\n leftHiddenItemsWeight += componentSize;\r\n itemsFromStartToScrollEnd = ii;\r\n }\r\n\r\n if (y < scrollSize + size + componentSize) {\r\n itemsFromStartToDisplayEnd = ii;\r\n totalItemsToDisplayEndWeight += componentSize;\r\n itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + itemsOffset;\r\n } else if (i < itemsFromDisplayEndToOffsetEnd) {\r\n rightItemsWeight += componentSize;\r\n }\r\n\r\n y += componentSize;\r\n }\r\n\r\n if (itemsFromStartToScrollEnd === -1) {\r\n itemsFromStartToScrollEnd = 0;\r\n }\r\n if (itemsFromStartToDisplayEnd === -1) {\r\n itemsFromStartToDisplayEnd = 0;\r\n }\r\n\r\n leftItemsWeights.splice(0, leftItemsWeights.length - itemsOffset);\r\n leftItemsWeights.forEach(v => {\r\n leftItemsWeight += v;\r\n });\r\n\r\n leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);\r\n rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength\r\n ? totalLength - itemsFromStartToDisplayEnd : itemsOffset;\r\n startIndex = itemsFromStartToScrollEnd - leftItemLength;\r\n } else {\r\n itemsFromStartToScrollEnd = Math.ceil(scrollSize / typicalItemSize);\r\n itemsFromStartToDisplayEnd = Math.ceil((scrollSize + size) / typicalItemSize);\r\n leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);\r\n rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength\r\n ? totalLength - itemsFromStartToDisplayEnd : itemsOffset;\r\n startIndex = itemsFromStartToScrollEnd - leftItemLength;\r\n leftItemsWeight = leftItemLength * typicalItemSize;\r\n rightItemsWeight = rightItemLength * typicalItemSize,\r\n leftHiddenItemsWeight = itemsFromStartToScrollEnd * typicalItemSize,\r\n totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * typicalItemSize;\r\n }\r\n\r\n const itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight,\r\n itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd;\r\n\r\n const metrics = {\r\n itemsFromStartToScrollEnd,\r\n itemsFromStartToDisplayEnd,\r\n itemsOnDisplay,\r\n itemsOnDisplayLength,\r\n leftHiddenItemsWeight,\r\n leftItemLength,\r\n leftItemsWeight,\r\n rightItemLength,\r\n rightItemsWeight,\r\n snippedPos,\r\n totalItemsToDisplayEndWeight,\r\n totalSize,\r\n typicalItemSize,\r\n };\r\n\r\n return metrics;\r\n }\r\n\r\n /**\r\n * tracking by propName\r\n */\r\n track(): void {\r\n if (!this._items || !this._displayComponents) {\r\n return;\r\n }\r\n\r\n this._tracker.track(this._items, this._displayComponents);\r\n }\r\n\r\n setDisplayObjectIndexMapById(v: { [id: number]: number }): void {\r\n this._tracker.displayObjectIndexMapById = v;\r\n }\r\n\r\n untrackComponentByIdProperty(component?: NgVirtualListItemComponent | undefined) {\r\n this._tracker.untrackComponentByIdProperty(component);\r\n }\r\n\r\n cacheElements(): void {\r\n if (!this._displayComponents) {\r\n return;\r\n }\r\n\r\n for (let i = 0, l = this._displayComponents.length; i < l; i++) {\r\n const component = this._displayComponents[i], itemId = component.instance.itemId;\r\n if (itemId === undefined) {\r\n continue;\r\n }\r\n const bounds = component.instance.getBounds();\r\n this.set(itemId, bounds);\r\n }\r\n }\r\n\r\n /**\r\n * Returns calculated bounds from cache\r\n */\r\n private getBoundsFromCache(items: IVirtualListCollection, typicalItemSize: number, isVertical: boolean) {\r\n const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, map = this._map;\r\n let size: number = 0;\r\n for (let i = 0, l = items.length; i < l; i++) {\r\n const item = items[i];\r\n if (map.has(item.id)) {\r\n const bounds = map.get(item.id);\r\n size += bounds ? bounds[sizeProperty] : typicalItemSize;\r\n } else {\r\n size += typicalItemSize;\r\n }\r\n }\r\n return size;\r\n }\r\n\r\n override dispose() {\r\n super.dispose();\r\n\r\n if (this._debounceChanges) {\r\n this._debounceChanges.dispose();\r\n }\r\n\r\n if (this._tracker) {\r\n this._tracker.dispose();\r\n }\r\n }\r\n}\r\n","import {\r\n AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, ElementRef, inject, input,\r\n OnDestroy, output, signal, TemplateRef, ViewChild, viewChild, ViewContainerRef, ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, of, switchMap, tap } from 'rxjs';\r\nimport { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';\r\nimport {\r\n BEHAVIOR_AUTO, BEHAVIOR_INSTANT, CLASS_LIST_HORIZONTAL, CLASS_LIST_VERTICAL, DEFAULT_DIRECTION, DEFAULT_DYNAMIC_SIZE, DEFAULT_ITEM_SIZE,\r\n DEFAULT_ITEMS_OFFSET, DEFAULT_SNAP, DEFAULT_SNAP_TO_ITEM, HEIGHT_PROP_NAME, LEFT_PROP_NAME, PX, SCROLL, SCROLL_END, TOP_PROP_NAME,\r\n TRACK_BY_PROPERTY_NAME, WIDTH_PROP_NAME, X_PROP_NAME, Y_PROP_NAME,\r\n} from './const';\r\nimport { IVirtualListCollection, IVirtualListItem, IVirtualListStickyMap } from './models';\r\nimport { Id } from './types';\r\nimport { IRenderVirtualListCollection } from './models/render-collection.model';\r\nimport { IRenderVirtualListItem } from './models/render-item.model';\r\nimport { Direction, Directions } from './enums';\r\nimport { TrackBox, isDirection, toggleClassName } from './utils';\r\nimport { TRACK_BOX_CHANGE_EVENT_NAME } from './utils/trackBox';\r\n\r\n/**\r\n * Virtual list component.\r\n * Maximum performance for extremely large lists.\r\n * It is based on algorithms for virtualization of screen objects.\r\n * @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list\r\n * @author Evgenii Grebennikov\r\n * @email djonnyx@gmail.com\r\n */\r\n@Component({\r\n selector: 'ng-virtual-list',\r\n imports: [CommonModule],\r\n templateUrl: './ng-virtual-list.component.html',\r\n styleUrl: './ng-virtual-list.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.ShadowDom,\r\n})\r\nexport class NgVirtualListComponent implements AfterViewInit, OnDestroy {\r\n private static __nextId: number = 0;\r\n\r\n private _id: number = NgVirtualListComponent.__nextId;\r\n /**\r\n * Readonly. Returns the unique identifier of the component.\r\n */\r\n get id() { return this._id; }\r\n\r\n @ViewChild('renderersContainer', { read: ViewContainerRef })\r\n protected _listContainerRef: ViewContainerRef | undefined;\r\n\r\n protected _container = viewChild<ElementRef<HTMLDivElement>>('container');\r\n\r\n protected _list = viewChild<ElementRef<HTMLUListElement>>('list');\r\n\r\n /**\r\n * Fires when the list has been scrolled.\r\n */\r\n onScroll = output<Event | undefined>();\r\n\r\n /**\r\n * Fires when the list has completed scrolling.\r\n */\r\n onScrollEnd = output<Event | undefined>();\r\n\r\n /**\r\n * Collection of list items.\r\n */\r\n items = input.required<IVirtualListCollection>();\r\n\r\n /**\r\n * Determines whether elements will snap. Default value is \"true\".\r\n */\r\n snap = input<boolean>(DEFAULT_SNAP);\r\n\r\n /**\r\n * Determines whether scroll positions will be snapped to the element. Default value is \"false\".\r\n */\r\n snapToItem = input<boolean>(DEFAULT_SNAP_TO_ITEM);\r\n\r\n /**\r\n * Rendering element template.\r\n */\r\n itemRenderer = input.required<TemplateRef<any>>();\r\n\r\n /**\r\n * Dictionary zIndex by id of the list element. If the value is not set or equal to 0,\r\n * then a simple element is displayed, if the value is greater than 0, then the sticky position mode is enabled for the element.\r\n */\r\n stickyMap = input<IVirtualListStickyMap>({});\r\n\r\n /**\r\n * If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element.\r\n * Ignored if the dynamicSize property is true.\r\n */\r\n itemSize = input(DEFAULT_ITEM_SIZE);\r\n\r\n /**\r\n * If true then the items in the list can have different sizes and the itemSize property is ignored.\r\n * If false then the items in the list have a fixed size specified by the itemSize property. The default value is false.\r\n */\r\n dynamicSize = input(DEFAULT_DYNAMIC_SIZE);\r\n\r\n /**\r\n * Determines the direction in which elements are placed. Default value is \"vertical\".\r\n */\r\n direction = input<Direction>(DEFAULT_DIRECTION);\r\n\r\n /**\r\n * Number of elements outside the scope of visibility. Default value is 2.\r\n */\r\n itemsOffset = input<number>(DEFAULT_ITEMS_OFFSET);\r\n\r\n private _isVertical = this.getIsVertical();\r\n\r\n protected _displayItems = signal<IRenderVirtualListCollection | null>(null);\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> = [];\r\n\r\n protected _bounds = signal<DOMRect | null>(null);\r\n\r\n protected _scrollSize = signal<number>(0);\r\n\r\n private _resizeObserver: ResizeObserver | null = null;\r\n\r\n private _onResizeHandler = () => {\r\n this._bounds.set(this._container()?.nativeElement?.getBoundingClientRect() ?? null);\r\n }\r\n\r\n private _onScrollHandler = (e: Event) => {\r\n const target = e.target as HTMLDivElement,\r\n scrollSize = this._isVertical ? target.scrollTop : target.scrollLeft;\r\n\r\n this._scrollSize.set(scrollSize);\r\n\r\n this.onScroll.emit(e);\r\n }\r\n\r\n private _onScrollEndHandler = (e: Event) => {\r\n const target = e.target as HTMLDivElement, s = this.itemSize(), itemSize = s < 0 ? DEFAULT_ITEM_SIZE : s,\r\n snapToItem = this.snapToItem(), scrollSize = this._isVertical ? target.scrollTop : target.scrollLeft,\r\n scrollItems = Math.round(scrollSize / itemSize), actualScrollSize = snapToItem ? scrollItems * itemSize : scrollSize;\r\n\r\n if (target.scrollTop !== actualScrollSize) {\r\n const container = target, params: ScrollToOptions = {\r\n [this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,\r\n behavior: BEHAVIOR_INSTANT\r\n };\r\n\r\n container.scroll(params);\r\n }\r\n\r\n this.onScrollEnd.emit(e);\r\n }\r\n\r\n private _elementRef = inject(ElementRef<HTMLDivElement>);\r\n\r\n private _initialized = signal<boolean>(false);\r\n\r\n /**\r\n * Dictionary of element sizes by their id\r\n */\r\n private _trackBox = new TrackBox(TRACK_BY_PROPERTY_NAME);\r\n\r\n private _onTrackBoxChangeHandler = (v: number) => {\r\n this._$cacheVersion.next(v);\r\n }\r\n\r\n private _$cacheVersion = new BehaviorSubject<number>(-1);\r\n get $cacheVersion() { return this._$cacheVersion.asObservable(); }\r\n\r\n constructor() {\r\n NgVirtualListComponent.__nextId = NgVirtualListComponent.__nextId + 1 === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListComponent.__nextId + 1;\r\n this._id = NgVirtualListComponent.__nextId;\r\n\r\n this._trackBox.displayComponents = this._displayComponents;\r\n\r\n const $bounds = toObservable(this._bounds).pipe(\r\n filter(b => !!b),\r\n ), $items = toObservable(this.items).pipe(\r\n map(i => !i ? [] : i),\r\n ), $scrollSize = toObservable(this._scrollSize),\r\n $itemSize = toObservable(this.itemSize).pipe(\r\n map(v => v <= 0 ? DEFAULT_ITEM_SIZE : v),\r\n ),\r\n $itemsOffset = toObservable(this.itemsOffset).pipe(\r\n map(v => v < 0 ? DEFAULT_ITEMS_OFFSET : v),\r\n ),\r\n $stickyMap = toObservable(this.stickyMap).pipe(\r\n map(v => !v ? {} : v),\r\n ),\r\n $snap = toObservable(this.snap),\r\n $isVertical = toObservable(this.direction).pipe(\r\n map(v => this.getIsVertical(v || DEFAULT_DIRECTION)),\r\n ),\r\n $dynamicSize = toObservable(this.dynamicSize),\r\n $cacheVersion = this.$cacheVersion,\r\n $displayItems = toObservable(this._displayItems),\r\n $initialized = toObservable(this._initialized);\r\n\r\n $isVertical.pipe(\r\n takeUntilDestroyed(),\r\n tap(v => {\r\n this._isVertical = v;\r\n const el: HTMLElement = this._elementRef.nativeElement;\r\n toggleClassName(el, v ? CLASS_LIST_VERTICAL : CLASS_LIST_HORIZONTAL, true);\r\n }),\r\n ).subscribe();\r\n\r\n $dynamicSize.pipe(\r\n takeUntilDestroyed(),\r\n tap(dynamicSize => {\r\n if (dynamicSize) {\r\n if (!this._trackBox.hasEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler)) {\r\n this._trackBox.addEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler);\r\n }\r\n } else {\r\n if (this._trackBox.hasEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler)) {\r\n this._trackBox.removeEventListener(TRACK_BOX_CHANGE_EVENT_NAME, this._onTrackBoxChangeHandler);\r\n }\r\n }\r\n })\r\n ).subscribe();\r\n\r\n $displayItems.pipe(\r\n takeUntilDestroyed(),\r\n tap((displayItems) => {\r\n this._trackBox.items = displayItems;\r\n })\r\n ).subscribe();\r\n\r\n combineLatest([$initialized, $bounds, $items, $stickyMap, $scrollSize, $itemSize,\r\n $itemsOffset, $snap, $isVertical, $dynamicSize, $cacheVersion,\r\n ]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n switchMap(([,\r\n bounds, items, stickyMap, scrollSize, itemSize,\r\n itemsOffset, snap, isVertical, dynamicSize, cacheVersion,\r\n ]) => {\r\n this._trackBox.cacheElements();\r\n\r\n const { width, height } = bounds,\r\n {\r\n itemsFromStartToScrollEnd,\r\n itemsOnDisplay,\r\n itemsOnDisplayLength,\r\n leftHiddenItemsWeight,\r\n leftItemLength,\r\n leftItemsWeight,\r\n rightItemLength,\r\n rightItemsWeight,\r\n snippedPos,\r\n totalSize,\r\n typicalItemSize,\r\n } = this._trackBox.recalculateMetrics({\r\n bounds: { width, height }, collection: items,\r\n dynamicSize, isVertical, itemSize, itemsOffset, scrollSize, snap,\r\n });\r\n\r\n // Необходима кореляция startDisplayObjectY с помощью дельты от высоты предыдущей и текущей размеченной области по версии кэша.\r\n // TrackBox может расчитать дельту!\r\n\r\n return of({\r\n items, stickyMap, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd,\r\n itemsOnDisplay, itemsOnDisplayLength, leftHiddenItemsWeight, itemSize: typicalItemSize,\r\n totalSize, snap, leftItemLength, leftItemsWeight, rightItemLength, rightItemsWeight, snippedPos,\r\n dynamicSize,\r\n });\r\n }),\r\n tap(({\r\n items, stickyMap, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd,\r\n itemsOnDisplay, itemsOnDisplayLength, leftHiddenItemsWeight, leftItemLength, leftItemsWeight,\r\n rightItemLength, rightItemsWeight, snippedPos, itemSize, totalSize, snap, dynamicSize: dynamic,\r\n }) => {\r\n const displayItems: IRenderVirtualListCollection = [];\r\n if (items.length) {\r\n const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME,\r\n w = isVertical ? width : itemSize, h = isVertical ? itemSize : height, totalItems = items.length,\r\n startIndex = itemsFromStartToScrollEnd - leftItemLength;\r\n\r\n let pos = leftHiddenItemsWeight - leftItemsWeight,\r\n renderItems = itemsOnDisplayLength + leftItemLength + rightItemLength,\r\n stickyItem: IRenderVirtualListItem | undefined, nextSticky: IRenderVirtualListItem | undefined, stickyItemIndex = -1,\r\n stickyItemSize = 0;\r\n\r\n if (snap) {\r\n for (let i = itemsFromStartToScrollEnd - 1; i >= 0; i--) {\r\n const id = items[i].id, sticky = stickyMap[id], size = dynamic ? this._trackBox.get(id)?.[sizeProperty] || itemSize : itemSize;\r\n stickyItemSize = size;\r\n if (sticky > 0) {\r\n const measures = {\r\n x: isVertical ? 0 : snippedPos,\r\n y: isVertical ? snippedPos : 0,\r\n width: w,\r\n height: h,\r\n }, config = {\r\n isVertical,\r\n sticky,\r\n snap,\r\n snapped: true,\r\n dynamic,\r\n };\r\n\r\n const itemData: IVirtualListItem = items[i];\r\n\r\n stickyItem = { id, measures, data: itemData, config };\r\n stickyItemIndex = i;\r\n\r\n displayItems.push(stickyItem);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let i = startIndex;\r\n\r\n while (renderItems > 0) {\r\n if (i >= totalItems) {\r\n break;\r\n }\r\n\r\n const id = items[i].id, size = dynamic ? this._trackBox.get(id)?.[sizeProperty] || itemSize : itemSize;\r\n\r\n if (id !== stickyItem?.id) {\r\n const snaped = snap && stickyMap[id] > 0 && pos <= scrollSize,\r\n measures = {\r\n x: isVertical ? 0 : pos,\r\n y: isVertical ? pos : 0,\r\n width: w,\r\n height: h,\r\n }, config = {\r\n isVertical,\r\n sticky: stickyMap[id],\r\n snap,\r\n snapped: false,\r\n dynamic,\r\n };\r\n\r\n const itemData: IVirtualListItem = items[i];\r\n\r\n const item: IRenderVirtualListItem = { id, measures, data: itemData, config };\r\n if (!nextSticky && stickyItemIndex < i && snap && stickyMap[id] > 0 && pos <= scrollSize + size) {\r\n item.measures.x = isVertical ? 0 : snaped ? snippedPos : pos;\r\n item.measures.y = isVertical ? snaped ? snippedPos : pos : 0;\r\n nextSticky = item;\r\n }\r\n displayItems.push(item);\r\n }\r\n\r\n renderItems -= 1;\r\n pos += size;\r\n i++;\r\n }\r\n\r\n const axis = isVertical ? Y_PROP_NAME : X_PROP_NAME;\r\n\r\n if (nextSticky && stickyItem && nextSticky.measures[axis] <= scrollSize + stickyItemSize) {\r\n if (nextSticky.measures[axis] > scrollSize) {\r\n stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItemSize;\r\n stickyItem.config.snapped = nextSticky.config.snapped = false;\r\n stickyItem.config.sticky = 1;\r\n } else {\r\n nextSticky.config.snapped = true;\r\n }\r\n }\r\n }\r\n\r\n this._displayItems.set(displayItems);\r\n\r\n this.resetBoundsSize(isVertical, totalSize);\r\n })\r\n ).subscribe();\r\n\r\n combineLatest([$initialized, toObservable(this.itemRenderer)]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n tap(([, itemRenderer]) => {\r\n this.resetRenderers(itemRenderer);\r\n })\r\n )\r\n\r\n combineLatest([$initialized, $displayItems]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\r\n filter(([initialized]) => !!initialized),\r\n tap(([, displayItems]) => {\r\n this.createDisplayComponentsIfNeed(displayItems);\r\n this.tracking();\r\n }),\r\n ).subscribe();\r\n }\r\n\r\n ngOnInit() {\r\n this._initialized.set(true);\r\n }\r\n\r\n private getIsVertical(d?: Direction) {\r\n const dir = d || this.direction();\r\n return isDirection(dir, Directions.VERTICAL);\r\n }\r\n\r\n private createDisplayComponentsIfNeed(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems || !this._listContainerRef) {\r\n this._trackBox.setDisplayObjectIndexMapById({});\r\n return;\r\n }\r\n const _listContainerRef = this._listContainerRef;\r\n\r\n while (this._displayComponents.length < displayItems.length) {\r\n if (_listContainerRef) {\r\n const comp = _listContainerRef.createComponent(NgVirtualListItemComponent);\r\n this._displayComponents.push(comp);\r\n }\r\n }\r\n\r\n const maxLength = displayItems.length;\r\n while (this._displayComponents.length > maxLength) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n const id = comp?.instance.item?.id;\r\n if (id !== undefined) {\r\n this._trackBox.untrackComponentByIdProperty(comp?.instance);\r\n }\r\n }\r\n\r\n this.resetRenderers();\r\n }\r\n\r\n private resetRenderers(itemRenderer?: TemplateRef<any>) {\r\n const doMap: { [id: number]: number } = {};\r\n for (let i = 0, l = this._displayComponents.length; i < l; i++) {\r\n const item = this._displayComponents[i];\r\n item.instance.renderer = itemRenderer || this.itemRenderer();\r\n doMap[item.instance.id] = i;\r\n }\r\n\r\n this._trackBox.setDisplayObjectIndexMapById(doMap);\r\n }\r\n\r\n /**\r\n * tracking by id\r\n */\r\n protected tracking() {\r\n this._trackBox.track();\r\n }\r\n\r\n private resetBoundsSize(isVertical: boolean, totalSize: number) {\r\n const l = this._list();\r\n if (l) {\r\n l.nativeElement.style[isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME] = `${totalSize}${PX}`;\r\n }\r\n }\r\n\r\n /**\r\n * The method scrolls the list to the element with the given id and returns the value of the scrolled area.\r\n * Behavior accepts the values \"auto\", \"instant\" and \"smooth\".\r\n */\r\n scrollTo(id: Id, behavior: ScrollBehavior = BEHAVIOR_AUTO) {\r\n const items = this.items();\r\n if (!items || !items.length) {\r\n return;\r\n }\r\n\r\n const index = items.findIndex(item => item.id === id), scrollSize = index * this.itemSize(), container = this._container();\r\n if (container) {\r\n const params: ScrollToOptions = { [this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior };\r\n container.nativeElement.scroll(params);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n containerEl.nativeElement.addEventListener(SCROLL, this._onScrollHandler);\r\n containerEl.nativeElement.addEventListener(SCROLL_END, this._onScrollEndHandler);\r\n\r\n this._resizeObserver = new ResizeObserver(this._onResizeHandler);\r\n this._resizeObserver.observe(containerEl.nativeElement);\r\n\r\n this._onResizeHandler();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this._trackBox) {\r\n this._trackBox.dispose();\r\n }\r\n\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n containerEl.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);\r\n containerEl.nativeElement.removeEventListener(SCROLL_END, this._onScrollEndHandler);\r\n\r\n if (this._resizeObserver) {\r\n this._resizeObserver.unobserve(containerEl.nativeElement);\r\n }\r\n }\r\n\r\n if (this._displayComponents) {\r\n while (this._displayComponents.length > 0) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n }\r\n }\r\n}\r\n","<div #container part=\"scroller\" class=\"ngvl__container\">\r\n <ul #list part=\"list\" class=\"ngvl__list\">\r\n <ng-container #renderersContainer></ng-container>\r\n </ul>\r\n</div>","/*\r\n * Public API Surface of ng-virtual-list\r\n */\r\n\r\nexport * from './lib/ng-virtual-list.component';\r\nexport * from './lib/models';\r\nexport * from './lib/types';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export declare class NgVirtualListItemComponent {
|
|
|
15
15
|
data: import("@angular/core").WritableSignal<IRenderVirtualListItem | undefined>;
|
|
16
16
|
private _data;
|
|
17
17
|
set item(v: IRenderVirtualListItem | undefined);
|
|
18
|
+
get itemId(): import("ng-virtual-list").Id | undefined;
|
|
18
19
|
itemRenderer: import("@angular/core").WritableSignal<TemplateRef<any> | undefined>;
|
|
19
20
|
set renderer(v: TemplateRef<any> | undefined);
|
|
20
21
|
private _elementRef;
|
package/lib/const/index.d.ts
CHANGED
|
@@ -8,3 +8,24 @@ export declare const DEFAULT_DYNAMIC_SIZE = false;
|
|
|
8
8
|
export declare const TRACK_BY_PROPERTY_NAME = "id";
|
|
9
9
|
export declare const DEFAULT_DIRECTION = Directions.VERTICAL;
|
|
10
10
|
export declare const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;
|
|
11
|
+
export declare const BEHAVIOR_INSTANT = "instant";
|
|
12
|
+
export declare const BEHAVIOR_AUTO = "auto";
|
|
13
|
+
export declare const VISIBILITY_VISIBLE = "visible";
|
|
14
|
+
export declare const VISIBILITY_HIDDEN = "hidden";
|
|
15
|
+
export declare const SIZE_100_PERSENT = "100%";
|
|
16
|
+
export declare const SIZE_AUTO = "auto";
|
|
17
|
+
export declare const POSITION_ABSOLUTE = "absolute";
|
|
18
|
+
export declare const POSITION_STICKY = "sticky";
|
|
19
|
+
export declare const TRANSLATE_3D = "translate3d";
|
|
20
|
+
export declare const ZEROS_TRANSLATE_3D = "translate3d(0,0,0)";
|
|
21
|
+
export declare const TOP_PROP_NAME = "top";
|
|
22
|
+
export declare const LEFT_PROP_NAME = "left";
|
|
23
|
+
export declare const X_PROP_NAME = "x";
|
|
24
|
+
export declare const Y_PROP_NAME = "y";
|
|
25
|
+
export declare const WIDTH_PROP_NAME = "width";
|
|
26
|
+
export declare const HEIGHT_PROP_NAME = "height";
|
|
27
|
+
export declare const PX = "px";
|
|
28
|
+
export declare const SCROLL = "scroll";
|
|
29
|
+
export declare const SCROLL_END = "scrollend";
|
|
30
|
+
export declare const CLASS_LIST_VERTICAL = "vertical";
|
|
31
|
+
export declare const CLASS_LIST_HORIZONTAL = "horizontal";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple debounce function.
|
|
3
|
+
* @homepage https://github.com/DjonnyX/ng-virtual-list/tree/main/projects/ng-virtual-list
|
|
4
|
+
* @author Evgenii Grebennikov
|
|
5
|
+
* @email djonnyx@gmail.com
|
|
6
|
+
*/
|
|
7
|
+
export declare const debounce: (cb: (...args: Array<any>) => void, debounceTime?: number) => {
|
|
8
|
+
execute: (...args: Array<any>) => void;
|
|
9
|
+
dispose: () => void;
|
|
10
|
+
};
|
package/lib/utils/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isDirection } from "./isDirection";
|
|
2
|
+
import { debounce } from "./debounce";
|
|
2
3
|
import { toggleClassName } from './toggleClassName';
|
|
3
4
|
import { Tracker } from "./tracker";
|
|
4
5
|
import { TrackBox } from "./trackBox";
|
|
5
|
-
export { isDirection, toggleClassName, TrackBox, Tracker, };
|
|
6
|
+
export { isDirection, debounce, toggleClassName, TrackBox, Tracker, };
|
package/lib/utils/trackBox.d.ts
CHANGED
|
@@ -8,10 +8,12 @@ import { IRect } from "../types/rect";
|
|
|
8
8
|
import { CacheMap } from "./cacheMap";
|
|
9
9
|
import { Tracker } from "./tracker";
|
|
10
10
|
import { ISize } from "../types";
|
|
11
|
+
export declare const TRACK_BOX_CHANGE_EVENT_NAME = "change";
|
|
11
12
|
export interface IMetrics {
|
|
12
13
|
itemsFromStartToScrollEnd: number;
|
|
13
14
|
itemsFromStartToDisplayEnd: number;
|
|
14
15
|
itemsOnDisplay: number;
|
|
16
|
+
itemsOnDisplayLength: number;
|
|
15
17
|
leftHiddenItemsWeight: number;
|
|
16
18
|
leftItemLength: number;
|
|
17
19
|
leftItemsWeight: number;
|
|
@@ -32,7 +34,7 @@ interface IRecalculateMetricsOptions {
|
|
|
32
34
|
scrollSize: number;
|
|
33
35
|
snap: boolean;
|
|
34
36
|
}
|
|
35
|
-
type CacheMapEvents =
|
|
37
|
+
type CacheMapEvents = typeof TRACK_BOX_CHANGE_EVENT_NAME;
|
|
36
38
|
type OnChangeEventListener = (version: number) => void;
|
|
37
39
|
type CacheMapListeners = OnChangeEventListener;
|
|
38
40
|
/**
|
|
@@ -49,26 +51,19 @@ export declare class TrackBox extends CacheMap<Id, IRect, CacheMapEvents, CacheM
|
|
|
49
51
|
set displayComponents(v: Array<ComponentRef<NgVirtualListItemComponent>> | null | undefined);
|
|
50
52
|
constructor(trackingPropertyName: string);
|
|
51
53
|
set(id: Id, bounds: IRect): Map<Id, IRect>;
|
|
52
|
-
private
|
|
54
|
+
private _fireChanges;
|
|
55
|
+
private _debounceChanges;
|
|
53
56
|
protected fireChange(): void;
|
|
54
|
-
private clearchangesTimeouts;
|
|
55
57
|
recalculateMetrics(options: IRecalculateMetricsOptions): IMetrics;
|
|
56
|
-
/**
|
|
57
|
-
* Calculates and returns the maximum size of a repeating item
|
|
58
|
-
*/
|
|
59
|
-
getTypicalItemSize(isVertical: boolean, defaultItemSize: number, fromIndex?: number, to?: number): number;
|
|
60
58
|
/**
|
|
61
59
|
* tracking by propName
|
|
62
60
|
*/
|
|
63
|
-
track(
|
|
61
|
+
track(): void;
|
|
64
62
|
setDisplayObjectIndexMapById(v: {
|
|
65
63
|
[id: number]: number;
|
|
66
64
|
}): void;
|
|
67
65
|
untrackComponentByIdProperty(component?: NgVirtualListItemComponent | undefined): void;
|
|
68
|
-
|
|
69
|
-
* Stores the element bounds in _sizeCacheMap
|
|
70
|
-
*/
|
|
71
|
-
private cacheElementBounds;
|
|
66
|
+
cacheElements(): void;
|
|
72
67
|
/**
|
|
73
68
|
* Returns calculated bounds from cache
|
|
74
69
|
*/
|