ng-virtual-list 16.0.13 → 16.0.14
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 +4 -3
- package/esm2022/lib/components/ng-virtual-list-item.component.mjs +8 -2
- package/esm2022/lib/ng-virtual-list.component.mjs +45 -13
- package/esm2022/lib/utils/cacheMap.mjs +7 -3
- package/esm2022/lib/utils/trackBox.mjs +71 -21
- package/esm2022/lib/utils/tracker.mjs +20 -29
- package/fesm2022/ng-virtual-list.mjs +147 -113
- package/fesm2022/ng-virtual-list.mjs.map +1 -1
- package/lib/components/ng-virtual-list-item.component.d.ts +3 -1
- package/lib/ng-virtual-list.component.d.ts +10 -2
- package/lib/utils/cacheMap.d.ts +1 -1
- package/lib/utils/trackBox.d.ts +9 -4
- package/lib/utils/tracker.d.ts +2 -2
- package/package.json +1 -1
- package/esm2022/lib/utils/collection.mjs +0 -50
- package/lib/utils/collection.d.ts +0 -19
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tracks display items by property
|
|
3
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/
|
|
3
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/15.x/projects/ng-virtual-list/src/lib/utils/tracker.ts
|
|
4
4
|
* @author Evgenii Grebennikov
|
|
5
5
|
* @email djonnyx@gmail.com
|
|
6
6
|
*/
|
|
@@ -26,6 +26,9 @@ export class Tracker {
|
|
|
26
26
|
return this._trackMap;
|
|
27
27
|
}
|
|
28
28
|
_trackingPropertyName;
|
|
29
|
+
set trackingPropertyName(v) {
|
|
30
|
+
this._trackingPropertyName = v;
|
|
31
|
+
}
|
|
29
32
|
constructor(trackingPropertyName) {
|
|
30
33
|
this._trackingPropertyName = trackingPropertyName;
|
|
31
34
|
}
|
|
@@ -43,17 +46,17 @@ export class Tracker {
|
|
|
43
46
|
const diId = this._trackMap[itemTrackingProperty];
|
|
44
47
|
if (this._trackMap.hasOwnProperty(itemTrackingProperty)) {
|
|
45
48
|
const lastIndex = this._displayObjectIndexMapById[diId], el = components[lastIndex];
|
|
46
|
-
|
|
47
|
-
const elId = el?.instance?.[itemTrackingProperty];
|
|
49
|
+
const elId = el?.instance?.id;
|
|
48
50
|
if (el && elId === diId) {
|
|
49
51
|
const indexByUntrackedItems = untrackedItems.findIndex(v => {
|
|
50
|
-
|
|
51
|
-
return v.instance[itemTrackingProperty] === elId;
|
|
52
|
+
return v.instance.id === elId;
|
|
52
53
|
});
|
|
53
54
|
if (indexByUntrackedItems > -1) {
|
|
54
|
-
el.instance.item
|
|
55
|
-
|
|
56
|
-
afterComponentSetup
|
|
55
|
+
if (el.instance.item !== item) {
|
|
56
|
+
el.instance.item = item;
|
|
57
|
+
if (afterComponentSetup !== undefined) {
|
|
58
|
+
afterComponentSetup(el.instance, item);
|
|
59
|
+
}
|
|
57
60
|
}
|
|
58
61
|
untrackedItems.splice(indexByUntrackedItems, 1);
|
|
59
62
|
continue;
|
|
@@ -65,13 +68,14 @@ export class Tracker {
|
|
|
65
68
|
if (untrackedItems.length > 0) {
|
|
66
69
|
const el = untrackedItems.shift(), item = items[i];
|
|
67
70
|
if (el) {
|
|
68
|
-
el.instance.item
|
|
69
|
-
|
|
70
|
-
this.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
if (el.instance.item !== item) {
|
|
72
|
+
el.instance.item = item;
|
|
73
|
+
if (this._trackMap) {
|
|
74
|
+
this._trackMap[itemTrackingProperty] = el.instance.id;
|
|
75
|
+
}
|
|
76
|
+
if (afterComponentSetup !== undefined) {
|
|
77
|
+
afterComponentSetup(el.instance, item);
|
|
78
|
+
}
|
|
75
79
|
}
|
|
76
80
|
}
|
|
77
81
|
}
|
|
@@ -85,25 +89,12 @@ export class Tracker {
|
|
|
85
89
|
return;
|
|
86
90
|
}
|
|
87
91
|
const propertyIdName = this._trackingPropertyName;
|
|
88
|
-
this._checkComponentProperty(component);
|
|
89
92
|
if (this._trackMap && component[propertyIdName] !== undefined) {
|
|
90
93
|
delete this._trackMap[propertyIdName];
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
|
-
_checkComponentProperty(component) {
|
|
94
|
-
if (!component) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
const propertyIdName = this._trackingPropertyName;
|
|
98
|
-
try {
|
|
99
|
-
component[propertyIdName];
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
throw Error(`Property ${propertyIdName} does not exist.`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
96
|
dispose() {
|
|
106
97
|
this._trackMap = null;
|
|
107
98
|
}
|
|
108
99
|
}
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL3V0aWxzL3RyYWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUE7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sT0FBTztJQUNoQjs7T0FFRztJQUNLLDBCQUEwQixHQUE2QixFQUFFLENBQUM7SUFFbEUsSUFBSSx5QkFBeUIsQ0FBQyxDQUEyQjtRQUNyRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsS0FBSyxDQUFDLEVBQUU7WUFDdkMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFDekIsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUyxHQUFnRCxFQUFFLENBQUM7SUFFcEUsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFTyxxQkFBcUIsQ0FBVTtJQUV2QyxZQUFZLG9CQUE0QjtRQUNwQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQWlCLEVBQUUsVUFBb0MsRUFDekQsbUJBQXFEO1FBQ3JELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsY0FBYyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUVoRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLEtB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QUNMLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxTQUFhO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixPQUFPO1NBQ1Y7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFFbEQsSUFBSTtZQUNDLFNBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDdEM7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNWLE1BQU0sS0FBSyxDQUFDLFlBQVksY0FBYyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzdEO0lBQ0wsQ0FBQztJQUVELE9BQU87UUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxudHlwZSBUcmFja2luZ1Byb3BlcnR5SWQgPSBzdHJpbmcgfCBudW1iZXI7XHJcblxyXG4vKipcclxuICogVHJhY2tzIGRpc3BsYXkgaXRlbXMgYnkgcHJvcGVydHlcclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTYueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja2VyLnRzXHJcbiAqIEBhdXRob3IgRXZnZW5paSBHcmViZW5uaWtvdlxyXG4gKiBAZW1haWwgZGpvbm55eEBnbWFpbC5jb21cclxuICovXHJcbmV4cG9ydCBjbGFzcyBUcmFja2VyPEkgPSBhbnksIEMgPSB7IFtwcm9wOiBzdHJpbmddOiBhbnk7IH0+IHtcclxuICAgIC8qKlxyXG4gICAgICogZGlzcGxheSBvYmplY3RzIGRpY3Rpb25hcnkgb2YgaW5kZXhlcyBieSBpZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9kaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkOiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0gPSB7fTtcclxuXHJcbiAgICBzZXQgZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCh2OiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0pIHtcclxuICAgICAgICBpZiAodGhpcy5fZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpY3Rpb25hcnkgZGlzcGxheUl0ZW1zIHByb3BlcnR5TmFtZUlkIGJ5IGl0ZW1zIHByb3BlcnR5TmFtZUlkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3RyYWNrTWFwOiB7IFtpZDogVHJhY2tpbmdQcm9wZXJ0eUlkXTogbnVtYmVyIH0gfCBudWxsID0ge307XHJcblxyXG4gICAgZ2V0IHRyYWNrTWFwKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90cmFja01hcDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90cmFja2luZ1Byb3BlcnR5TmFtZSE6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2luZ1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB0cmFja2luZ1Byb3BlcnR5TmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRyYWNraW5nIGJ5IHByb3BOYW1lXHJcbiAgICAgKi9cclxuICAgIHRyYWNrKGl0ZW1zOiBBcnJheTxhbnk+LCBjb21wb25lbnRzOiBBcnJheTxDb21wb25lbnRSZWY8YW55Pj4sXHJcbiAgICAgICAgYWZ0ZXJDb21wb25lbnRTZXR1cD86IChjb21wb25lbnQ6IEMsIGl0ZW06IEkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGlkUHJvcE5hbWUgPSB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZSwgdW50cmFja2VkSXRlbXMgPSBbLi4uY29tcG9uZW50c107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXSwgaXRlbVRyYWNraW5nUHJvcGVydHkgPSBpdGVtW2lkUHJvcE5hbWVdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaUlkID0gdGhpcy5fdHJhY2tNYXBbaXRlbVRyYWNraW5nUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwLmhhc093blByb3BlcnR5KGl0ZW1UcmFja2luZ1Byb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuX2Rpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWRbZGlJZF0sIGVsID0gY29tcG9uZW50c1tsYXN0SW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja0NvbXBvbmVudFByb3BlcnR5KGVsPy5pbnN0YW5jZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsSWQgPSBlbD8uaW5zdGFuY2U/LltpdGVtVHJhY2tpbmdQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICYmIGVsSWQgPT09IGRpSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhCeVVudHJhY2tlZEl0ZW1zID0gdW50cmFja2VkSXRlbXMuZmluZEluZGV4KHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tDb21wb25lbnRQcm9wZXJ0eSh2Lmluc3RhbmNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5pbnN0YW5jZVtpdGVtVHJhY2tpbmdQcm9wZXJ0eV0gPT09IGVsSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhCeVVudHJhY2tlZEl0ZW1zID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmluc3RhbmNlLml0ZW0gPSBpdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbXBvbmVudFNldHVwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbXBvbmVudFNldHVwKGVsLmluc3RhbmNlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRyYWNrZWRJdGVtcy5zcGxpY2UoaW5kZXhCeVVudHJhY2tlZEl0ZW1zLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90cmFja01hcFtpdGVtVHJhY2tpbmdQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh1bnRyYWNrZWRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHVudHJhY2tlZEl0ZW1zLnNoaWZ0KCksIGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLmluc3RhbmNlLml0ZW0gPSBpdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdHJhY2tNYXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tDb21wb25lbnRQcm9wZXJ0eShlbC5pbnN0YW5jZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFja01hcFtpdGVtVHJhY2tpbmdQcm9wZXJ0eV0gPSBlbC5pbnN0YW5jZVtpdGVtVHJhY2tpbmdQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21wb25lbnRTZXR1cCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tcG9uZW50U2V0dXAoZWwuaW5zdGFuY2UsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVudHJhY2tlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVHJhY2tpbmcgYnkgaWQgY2F1c2VkIGFuIGVycm9yLicpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVudHJhY2tDb21wb25lbnRCeUlkUHJvcGVydHkoY29tcG9uZW50PzogQyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5SWROYW1lID0gdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoZWNrQ29tcG9uZW50UHJvcGVydHkoY29tcG9uZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwICYmIChjb21wb25lbnQgYXMgYW55KVtwcm9wZXJ0eUlkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdHJhY2tNYXBbcHJvcGVydHlJZE5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jaGVja0NvbXBvbmVudFByb3BlcnR5KGNvbXBvbmVudD86IEMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcm9wZXJ0eUlkTmFtZSA9IHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSlbcHJvcGVydHlJZE5hbWVdO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgUHJvcGVydHkgJHtwcm9wZXJ0eUlkTmFtZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tNYXAgPSBudWxsO1xyXG4gICAgfVxyXG59Il19
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL3V0aWxzL3RyYWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUE7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sT0FBTztJQUNoQjs7T0FFRztJQUNLLDBCQUEwQixHQUE2QixFQUFFLENBQUM7SUFFbEUsSUFBSSx5QkFBeUIsQ0FBQyxDQUEyQjtRQUNyRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsS0FBSyxDQUFDLEVBQUU7WUFDdkMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFDekIsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUyxHQUFnRCxFQUFFLENBQUM7SUFFcEUsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFTyxxQkFBcUIsQ0FBVTtJQUV2QyxJQUFJLG9CQUFvQixDQUFDLENBQVM7UUFDOUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsWUFBWSxvQkFBNEI7UUFDcEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLG9CQUFvQixDQUFDO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFpQixFQUFFLFVBQW9DLEVBQ3pELG1CQUFxRDtRQUNyRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsT0FBTztTQUNWO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLGNBQWMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7UUFFaEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRS9ELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7b0JBQ3JELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUVwRixNQUFNLElBQUksR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxFQUFFLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTt3QkFDckIsTUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUN2RCxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQzt3QkFDbEMsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsRUFBRTs0QkFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7Z0NBQzNCLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQ0FFeEIsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7b0NBQ25DLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7aUNBQzFDOzZCQUNKOzRCQUVELGNBQWMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ2hELFNBQVM7eUJBQ1o7cUJBQ0o7b0JBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUM7aUJBQy9DO2FBQ0o7WUFFRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxFQUFFLEVBQUU7b0JBQ0osSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7d0JBQzNCLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzt3QkFFeEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFOzRCQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7eUJBQ3pEO3dCQUVELElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFOzRCQUNuQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUMxQztxQkFDSjtpQkFDSjthQUNKO1NBQ0o7UUFFRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUU7WUFDdkIsTUFBTSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtTQUNqRDtJQUNMLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxTQUFhO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixPQUFPO1NBQ1Y7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFFbEQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFLLFNBQWlCLENBQUMsY0FBYyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3BFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN6QztJQUNMLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbnR5cGUgVHJhY2tpbmdQcm9wZXJ0eUlkID0gc3RyaW5nIHwgbnVtYmVyO1xyXG5cclxuLyoqXHJcbiAqIFRyYWNrcyBkaXNwbGF5IGl0ZW1zIGJ5IHByb3BlcnR5XHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE1LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvdXRpbHMvdHJhY2tlci50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHJhY2tlcjxJID0gYW55LCBDID0geyBbcHJvcDogc3RyaW5nXTogYW55OyB9PiB7XHJcbiAgICAvKipcclxuICAgICAqIGRpc3BsYXkgb2JqZWN0cyBkaWN0aW9uYXJ5IG9mIGluZGV4ZXMgYnkgaWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZDogeyBbaWQ6IG51bWJlcl06IG51bWJlciB9ID0ge307XHJcblxyXG4gICAgc2V0IGRpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQodjogeyBbaWQ6IG51bWJlcl06IG51bWJlciB9KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaWN0aW9uYXJ5IGRpc3BsYXlJdGVtcyBwcm9wZXJ0eU5hbWVJZCBieSBpdGVtcyBwcm9wZXJ0eU5hbWVJZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF90cmFja01hcDogeyBbaWQ6IFRyYWNraW5nUHJvcGVydHlJZF06IG51bWJlciB9IHwgbnVsbCA9IHt9O1xyXG5cclxuICAgIGdldCB0cmFja01hcCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdHJhY2tNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdHJhY2tpbmdQcm9wZXJ0eU5hbWUhOiBzdHJpbmc7XHJcblxyXG4gICAgc2V0IHRyYWNraW5nUHJvcGVydHlOYW1lKHY6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2luZ1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB0cmFja2luZ1Byb3BlcnR5TmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRyYWNraW5nIGJ5IHByb3BOYW1lXHJcbiAgICAgKi9cclxuICAgIHRyYWNrKGl0ZW1zOiBBcnJheTxhbnk+LCBjb21wb25lbnRzOiBBcnJheTxDb21wb25lbnRSZWY8YW55Pj4sXHJcbiAgICAgICAgYWZ0ZXJDb21wb25lbnRTZXR1cD86IChjb21wb25lbnQ6IEMsIGl0ZW06IEkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGlkUHJvcE5hbWUgPSB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZSwgdW50cmFja2VkSXRlbXMgPSBbLi4uY29tcG9uZW50c107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXSwgaXRlbVRyYWNraW5nUHJvcGVydHkgPSBpdGVtW2lkUHJvcE5hbWVdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaUlkID0gdGhpcy5fdHJhY2tNYXBbaXRlbVRyYWNraW5nUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwLmhhc093blByb3BlcnR5KGl0ZW1UcmFja2luZ1Byb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuX2Rpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWRbZGlJZF0sIGVsID0gY29tcG9uZW50c1tsYXN0SW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbElkID0gZWw/Lmluc3RhbmNlPy5pZDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgJiYgZWxJZCA9PT0gZGlJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleEJ5VW50cmFja2VkSXRlbXMgPSB1bnRyYWNrZWRJdGVtcy5maW5kSW5kZXgodiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5pbnN0YW5jZS5pZCA9PT0gZWxJZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleEJ5VW50cmFja2VkSXRlbXMgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLmluc3RhbmNlLml0ZW0gIT09IGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnN0YW5jZS5pdGVtID0gaXRlbTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyQ29tcG9uZW50U2V0dXAgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbXBvbmVudFNldHVwKGVsLmluc3RhbmNlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50cmFja2VkSXRlbXMuc3BsaWNlKGluZGV4QnlVbnRyYWNrZWRJdGVtcywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdHJhY2tNYXBbaXRlbVRyYWNraW5nUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodW50cmFja2VkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWwgPSB1bnRyYWNrZWRJdGVtcy5zaGlmdCgpLCBpdGVtID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWwuaW5zdGFuY2UuaXRlbSAhPT0gaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5pbnN0YW5jZS5pdGVtID0gaXRlbTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmFja01hcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tNYXBbaXRlbVRyYWNraW5nUHJvcGVydHldID0gZWwuaW5zdGFuY2UuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbXBvbmVudFNldHVwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tcG9uZW50U2V0dXAoZWwuaW5zdGFuY2UsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodW50cmFja2VkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdUcmFja2luZyBieSBpZCBjYXVzZWQgYW4gZXJyb3IuJylcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wb25lbnQ/OiBDKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJvcGVydHlJZE5hbWUgPSB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwICYmIChjb21wb25lbnQgYXMgYW55KVtwcm9wZXJ0eUlkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdHJhY2tNYXBbcHJvcGVydHlJZE5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrTWFwID0gbnVsbDtcclxuICAgIH1cclxufSJdfQ==
|
|
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { Component, ChangeDetectionStrategy, EventEmitter as EventEmitter$1, ViewContainerRef, ElementRef, ViewEncapsulation, ViewChild, Output, Input, NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
5
|
-
import { BehaviorSubject, filter, map,
|
|
5
|
+
import { BehaviorSubject, tap, filter, map, combineLatest, distinctUntilChanged, debounceTime, switchMap, of } from 'rxjs';
|
|
6
6
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -60,7 +60,7 @@ const CLASS_LIST_HORIZONTAL = 'horizontal';
|
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
62
|
* Virtual list item component
|
|
63
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/
|
|
63
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/15.x/projects/ng-virtual-list/src/lib/components/ng-virtual-list-item.component.ts
|
|
64
64
|
* @author Evgenii Grebennikov
|
|
65
65
|
* @email djonnyx@gmail.com
|
|
66
66
|
*/
|
|
@@ -94,6 +94,9 @@ class NgVirtualListItemComponent {
|
|
|
94
94
|
}
|
|
95
95
|
this._cdr.detectChanges();
|
|
96
96
|
}
|
|
97
|
+
get item() {
|
|
98
|
+
return this.data;
|
|
99
|
+
}
|
|
97
100
|
get itemId() {
|
|
98
101
|
return this.data?.id;
|
|
99
102
|
}
|
|
@@ -105,6 +108,9 @@ class NgVirtualListItemComponent {
|
|
|
105
108
|
this.itemRenderer = v;
|
|
106
109
|
this._cdr.markForCheck();
|
|
107
110
|
}
|
|
111
|
+
get element() {
|
|
112
|
+
return this._elementRef.nativeElement;
|
|
113
|
+
}
|
|
108
114
|
constructor(_cdr, _elementRef) {
|
|
109
115
|
this._cdr = _cdr;
|
|
110
116
|
this._elementRef = _elementRef;
|
|
@@ -201,7 +207,7 @@ const toggleClassName = (el, className, remove = false) => {
|
|
|
201
207
|
|
|
202
208
|
/**
|
|
203
209
|
* Tracks display items by property
|
|
204
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/
|
|
210
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/15.x/projects/ng-virtual-list/src/lib/utils/tracker.ts
|
|
205
211
|
* @author Evgenii Grebennikov
|
|
206
212
|
* @email djonnyx@gmail.com
|
|
207
213
|
*/
|
|
@@ -227,6 +233,9 @@ class Tracker {
|
|
|
227
233
|
return this._trackMap;
|
|
228
234
|
}
|
|
229
235
|
_trackingPropertyName;
|
|
236
|
+
set trackingPropertyName(v) {
|
|
237
|
+
this._trackingPropertyName = v;
|
|
238
|
+
}
|
|
230
239
|
constructor(trackingPropertyName) {
|
|
231
240
|
this._trackingPropertyName = trackingPropertyName;
|
|
232
241
|
}
|
|
@@ -244,17 +253,17 @@ class Tracker {
|
|
|
244
253
|
const diId = this._trackMap[itemTrackingProperty];
|
|
245
254
|
if (this._trackMap.hasOwnProperty(itemTrackingProperty)) {
|
|
246
255
|
const lastIndex = this._displayObjectIndexMapById[diId], el = components[lastIndex];
|
|
247
|
-
|
|
248
|
-
const elId = el?.instance?.[itemTrackingProperty];
|
|
256
|
+
const elId = el?.instance?.id;
|
|
249
257
|
if (el && elId === diId) {
|
|
250
258
|
const indexByUntrackedItems = untrackedItems.findIndex(v => {
|
|
251
|
-
|
|
252
|
-
return v.instance[itemTrackingProperty] === elId;
|
|
259
|
+
return v.instance.id === elId;
|
|
253
260
|
});
|
|
254
261
|
if (indexByUntrackedItems > -1) {
|
|
255
|
-
el.instance.item
|
|
256
|
-
|
|
257
|
-
afterComponentSetup
|
|
262
|
+
if (el.instance.item !== item) {
|
|
263
|
+
el.instance.item = item;
|
|
264
|
+
if (afterComponentSetup !== undefined) {
|
|
265
|
+
afterComponentSetup(el.instance, item);
|
|
266
|
+
}
|
|
258
267
|
}
|
|
259
268
|
untrackedItems.splice(indexByUntrackedItems, 1);
|
|
260
269
|
continue;
|
|
@@ -266,13 +275,14 @@ class Tracker {
|
|
|
266
275
|
if (untrackedItems.length > 0) {
|
|
267
276
|
const el = untrackedItems.shift(), item = items[i];
|
|
268
277
|
if (el) {
|
|
269
|
-
el.instance.item
|
|
270
|
-
|
|
271
|
-
this.
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
278
|
+
if (el.instance.item !== item) {
|
|
279
|
+
el.instance.item = item;
|
|
280
|
+
if (this._trackMap) {
|
|
281
|
+
this._trackMap[itemTrackingProperty] = el.instance.id;
|
|
282
|
+
}
|
|
283
|
+
if (afterComponentSetup !== undefined) {
|
|
284
|
+
afterComponentSetup(el.instance, item);
|
|
285
|
+
}
|
|
276
286
|
}
|
|
277
287
|
}
|
|
278
288
|
}
|
|
@@ -286,23 +296,10 @@ class Tracker {
|
|
|
286
296
|
return;
|
|
287
297
|
}
|
|
288
298
|
const propertyIdName = this._trackingPropertyName;
|
|
289
|
-
this._checkComponentProperty(component);
|
|
290
299
|
if (this._trackMap && component[propertyIdName] !== undefined) {
|
|
291
300
|
delete this._trackMap[propertyIdName];
|
|
292
301
|
}
|
|
293
302
|
}
|
|
294
|
-
_checkComponentProperty(component) {
|
|
295
|
-
if (!component) {
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
const propertyIdName = this._trackingPropertyName;
|
|
299
|
-
try {
|
|
300
|
-
component[propertyIdName];
|
|
301
|
-
}
|
|
302
|
-
catch (err) {
|
|
303
|
-
throw Error(`Property ${propertyIdName} does not exist.`);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
303
|
dispose() {
|
|
307
304
|
this._trackMap = null;
|
|
308
305
|
}
|
|
@@ -417,7 +414,7 @@ const MAX_SCROLL_DIRECTION_POOL = 8, CLEAR_SCROLL_DIRECTION_TO = 0;
|
|
|
417
414
|
/**
|
|
418
415
|
* Cache map.
|
|
419
416
|
* Emits a change event on each mutation.
|
|
420
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/
|
|
417
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/15.x/projects/ng-virtual-list/src/lib/utils/cacheMap.ts
|
|
421
418
|
* @author Evgenii Grebennikov
|
|
422
419
|
* @email djonnyx@gmail.com
|
|
423
420
|
*/
|
|
@@ -481,7 +478,11 @@ class CacheMap extends EventEmitter {
|
|
|
481
478
|
this.dispatch('change', this.version);
|
|
482
479
|
}
|
|
483
480
|
set(id, bounds) {
|
|
484
|
-
if (this._map.has(id)
|
|
481
|
+
if (this._map.has(id)) {
|
|
482
|
+
const b = this._map.get(id), bb = bounds;
|
|
483
|
+
if (b.width === bb.width && b.height === bb.height) {
|
|
484
|
+
return this._map;
|
|
485
|
+
}
|
|
485
486
|
return this._map;
|
|
486
487
|
}
|
|
487
488
|
const v = this._map.set(id, bounds);
|
|
@@ -508,56 +509,6 @@ class CacheMap extends EventEmitter {
|
|
|
508
509
|
}
|
|
509
510
|
}
|
|
510
511
|
|
|
511
|
-
/**
|
|
512
|
-
* Returns the removed or updated elements of a collection.
|
|
513
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/16.x/projects/ng-virtual-list/src/lib/utils/collection.ts
|
|
514
|
-
* @author Evgenii Grebennikov
|
|
515
|
-
* @email djonnyx@gmail.com
|
|
516
|
-
*/
|
|
517
|
-
const getCollectionRemovedOrUpdatedItems = (previousCollection, currentCollection) => {
|
|
518
|
-
const result = { deleted: new Array(), updated: new Array(), added: new Array(), notChanged: new Array() };
|
|
519
|
-
if (!currentCollection || currentCollection.length === 0) {
|
|
520
|
-
return { deleted: (previousCollection ? [...previousCollection] : []), updated: [], added: [], notChanged: [] };
|
|
521
|
-
}
|
|
522
|
-
if (!previousCollection || previousCollection.length === 0) {
|
|
523
|
-
return { deleted: [], updated: [], added: (currentCollection ? [...currentCollection] : []), notChanged: [] };
|
|
524
|
-
}
|
|
525
|
-
const collectionDict = {};
|
|
526
|
-
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
527
|
-
const item = currentCollection[i];
|
|
528
|
-
if (item) {
|
|
529
|
-
collectionDict[item.id] = item;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
const notChangedMap = {}, deletedMap = {}, updatedMap = {};
|
|
533
|
-
for (let i = 0, l = previousCollection.length; i < l; i++) {
|
|
534
|
-
const item = previousCollection[i], id = item.id;
|
|
535
|
-
if (item) {
|
|
536
|
-
if (collectionDict.hasOwnProperty(id)) {
|
|
537
|
-
if (item === collectionDict[id]) {
|
|
538
|
-
result.notChanged.push(item);
|
|
539
|
-
notChangedMap[item.id] = item;
|
|
540
|
-
continue;
|
|
541
|
-
}
|
|
542
|
-
else {
|
|
543
|
-
result.updated.push(item);
|
|
544
|
-
updatedMap[item.id] = item;
|
|
545
|
-
continue;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
result.deleted.push(item);
|
|
549
|
-
deletedMap[item.id] = item;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
553
|
-
const item = currentCollection[i], id = item.id;
|
|
554
|
-
if (item && !deletedMap.hasOwnProperty(id) && !updatedMap.hasOwnProperty(id) && !notChangedMap.hasOwnProperty(id)) {
|
|
555
|
-
result.added.push(item);
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
return result;
|
|
559
|
-
};
|
|
560
|
-
|
|
561
512
|
const TRACK_BOX_CHANGE_EVENT_NAME = 'change';
|
|
562
513
|
var ItemDisplayMethods;
|
|
563
514
|
(function (ItemDisplayMethods) {
|
|
@@ -568,7 +519,7 @@ var ItemDisplayMethods;
|
|
|
568
519
|
})(ItemDisplayMethods || (ItemDisplayMethods = {}));
|
|
569
520
|
/**
|
|
570
521
|
* An object that performs tracking, calculations and caching.
|
|
571
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/
|
|
522
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/15.x/projects/ng-virtual-list/src/lib/utils/trackBox.ts
|
|
572
523
|
* @author Evgenii Grebennikov
|
|
573
524
|
* @email djonnyx@gmail.com
|
|
574
525
|
*/
|
|
@@ -588,13 +539,22 @@ class TrackBox extends CacheMap {
|
|
|
588
539
|
}
|
|
589
540
|
this._displayComponents = v;
|
|
590
541
|
}
|
|
542
|
+
/**
|
|
543
|
+
* Set the trackBy property
|
|
544
|
+
*/
|
|
545
|
+
set trackingPropertyName(v) {
|
|
546
|
+
this._tracker.trackingPropertyName = v;
|
|
547
|
+
}
|
|
591
548
|
constructor(trackingPropertyName) {
|
|
592
549
|
super();
|
|
593
550
|
this._tracker = new Tracker(trackingPropertyName);
|
|
594
551
|
}
|
|
595
552
|
set(id, bounds) {
|
|
596
|
-
if (this._map.has(id)
|
|
597
|
-
|
|
553
|
+
if (this._map.has(id)) {
|
|
554
|
+
const b = this._map.get(id);
|
|
555
|
+
if (b?.width === bounds.width && b.height === bounds.height) {
|
|
556
|
+
return this._map;
|
|
557
|
+
}
|
|
598
558
|
}
|
|
599
559
|
const v = this._map.set(id, bounds);
|
|
600
560
|
this.bumpVersion();
|
|
@@ -617,31 +577,69 @@ class TrackBox extends CacheMap {
|
|
|
617
577
|
console.warn('Attention! The collection must be immutable.');
|
|
618
578
|
return;
|
|
619
579
|
}
|
|
620
|
-
|
|
621
|
-
this.clearCache(deleted, updated, added, itemSize);
|
|
580
|
+
this.updateCache(this._previousCollection, currentCollection, itemSize);
|
|
622
581
|
this._previousCollection = currentCollection;
|
|
623
582
|
}
|
|
624
583
|
/**
|
|
625
|
-
*
|
|
584
|
+
* Update the cache of items from the list
|
|
626
585
|
*/
|
|
627
|
-
|
|
628
|
-
if (
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
586
|
+
updateCache(previousCollection, currentCollection, itemSize) {
|
|
587
|
+
if (!currentCollection || currentCollection.length === 0) {
|
|
588
|
+
if (previousCollection) {
|
|
589
|
+
// deleted
|
|
590
|
+
for (let i = 0, l = previousCollection.length; i < l; i++) {
|
|
591
|
+
const item = previousCollection[i], id = item.id;
|
|
592
|
+
if (this._map.has(id)) {
|
|
593
|
+
this._map.delete(id);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
if (!previousCollection || previousCollection.length === 0) {
|
|
600
|
+
if (currentCollection) {
|
|
601
|
+
// added
|
|
602
|
+
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
603
|
+
const item = currentCollection[i], id = item.id;
|
|
604
|
+
this._map.set(id, { x: 0, y: 0, width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });
|
|
633
605
|
}
|
|
634
606
|
}
|
|
607
|
+
return;
|
|
608
|
+
}
|
|
609
|
+
const collectionDict = {};
|
|
610
|
+
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
611
|
+
const item = currentCollection[i];
|
|
612
|
+
if (item) {
|
|
613
|
+
collectionDict[item.id] = item;
|
|
614
|
+
}
|
|
635
615
|
}
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
616
|
+
const notChangedMap = {}, deletedMap = {}, updatedMap = {};
|
|
617
|
+
for (let i = 0, l = previousCollection.length; i < l; i++) {
|
|
618
|
+
const item = previousCollection[i], id = item.id;
|
|
619
|
+
if (item) {
|
|
620
|
+
if (collectionDict.hasOwnProperty(id)) {
|
|
621
|
+
if (item === collectionDict[id]) {
|
|
622
|
+
// not changed
|
|
623
|
+
notChangedMap[item.id] = item;
|
|
624
|
+
this._map.set(id, { ...(this._map.get(id) || { x: 0, y: 0, width: itemSize, height: itemSize }), method: ItemDisplayMethods.NOT_CHANGED });
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
627
|
+
else {
|
|
628
|
+
// updated
|
|
629
|
+
updatedMap[item.id] = item;
|
|
630
|
+
this._map.set(id, { ...(this._map.get(id) || { x: 0, y: 0, width: itemSize, height: itemSize }), method: ItemDisplayMethods.UPDATE });
|
|
631
|
+
continue;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
// deleted
|
|
635
|
+
deletedMap[item.id] = item;
|
|
636
|
+
this._map.delete(id);
|
|
640
637
|
}
|
|
641
638
|
}
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
639
|
+
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
640
|
+
const item = currentCollection[i], id = item.id;
|
|
641
|
+
if (item && !deletedMap.hasOwnProperty(id) && !updatedMap.hasOwnProperty(id) && !notChangedMap.hasOwnProperty(id)) {
|
|
642
|
+
// added
|
|
645
643
|
this._map.set(id, { x: 0, y: 0, width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });
|
|
646
644
|
}
|
|
647
645
|
}
|
|
@@ -913,6 +911,10 @@ class TrackBox extends CacheMap {
|
|
|
913
911
|
this.clearScrollDirectionCache();
|
|
914
912
|
}
|
|
915
913
|
}
|
|
914
|
+
changes() {
|
|
915
|
+
this.bumpVersion();
|
|
916
|
+
this.fireChange();
|
|
917
|
+
}
|
|
916
918
|
generateDisplayCollection(items, stickyMap, metrics) {
|
|
917
919
|
const { normalizedItemWidth, normalizedItemHeight, dynamicSize, itemsFromStartToScrollEnd, isVertical, renderItems: renderItemsLength, scrollSize, sizeProperty, snap, snippedPos, startPosition, totalLength, startIndex, typicalItemSize, } = metrics, displayItems = [];
|
|
918
920
|
if (items.length) {
|
|
@@ -1084,7 +1086,7 @@ class ScrollEvent {
|
|
|
1084
1086
|
* Virtual list component.
|
|
1085
1087
|
* Maximum performance for extremely large lists.
|
|
1086
1088
|
* It is based on algorithms for virtualization of screen objects.
|
|
1087
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/
|
|
1089
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/15.x/projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts
|
|
1088
1090
|
* @author Evgenii Grebennikov
|
|
1089
1091
|
* @email djonnyx@gmail.com
|
|
1090
1092
|
*/
|
|
@@ -1264,6 +1266,19 @@ class NgVirtualListComponent {
|
|
|
1264
1266
|
}
|
|
1265
1267
|
;
|
|
1266
1268
|
get itemsOffset() { return this._$itemsOffset.getValue(); }
|
|
1269
|
+
_$trackBy = new BehaviorSubject(TRACK_BY_PROPERTY_NAME);
|
|
1270
|
+
$trackBy = this._$trackBy.asObservable();
|
|
1271
|
+
/**
|
|
1272
|
+
* The name of the property by which tracking is performed
|
|
1273
|
+
*/
|
|
1274
|
+
set trackBy(v) {
|
|
1275
|
+
if (this._$trackBy.getValue() === v) {
|
|
1276
|
+
return;
|
|
1277
|
+
}
|
|
1278
|
+
this._$trackBy.next(v);
|
|
1279
|
+
}
|
|
1280
|
+
;
|
|
1281
|
+
get trackBy() { return this._$trackBy.getValue(); }
|
|
1267
1282
|
_isVertical = this.getIsVertical();
|
|
1268
1283
|
_displayComponents = [];
|
|
1269
1284
|
_$bounds = new BehaviorSubject(null);
|
|
@@ -1371,7 +1386,7 @@ class NgVirtualListComponent {
|
|
|
1371
1386
|
/**
|
|
1372
1387
|
* Dictionary of element sizes by their id
|
|
1373
1388
|
*/
|
|
1374
|
-
_trackBox = new TrackBox(
|
|
1389
|
+
_trackBox = new TrackBox(this.trackBy);
|
|
1375
1390
|
_onTrackBoxChangeHandler = (v) => {
|
|
1376
1391
|
this._$cacheVersion.next(v);
|
|
1377
1392
|
};
|
|
@@ -1386,6 +1401,10 @@ class NgVirtualListComponent {
|
|
|
1386
1401
|
this._$initialized = new BehaviorSubject(false);
|
|
1387
1402
|
this.$initialized = this._$initialized.asObservable();
|
|
1388
1403
|
this._trackBox.displayComponents = this._displayComponents;
|
|
1404
|
+
const $trackBy = this.$trackBy;
|
|
1405
|
+
$trackBy.pipe(takeUntilDestroyed(), tap(v => {
|
|
1406
|
+
this._trackBox.trackingPropertyName = v;
|
|
1407
|
+
})).subscribe();
|
|
1389
1408
|
const $bounds = this._$bounds.asObservable().pipe(filter(b => !!b)), $items = this.$items.pipe(map(i => !i ? [] : i)), $scrollSize = this._$scrollSize.asObservable(), $itemSize = this.$itemSize.pipe(map(v => v <= 0 ? DEFAULT_ITEM_SIZE : v)), $itemsOffset = this.$itemsOffset.pipe(map(v => v < 0 ? DEFAULT_ITEMS_OFFSET : v)), $stickyMap = this.$stickyMap.pipe(map(v => !v ? {} : v)), $snap = this.$snap, $snapToItem = this.$snapToItem, $isVertical = this.$direction.pipe(map(v => this.getIsVertical(v || DEFAULT_DIRECTION))), $dynamicSize = this.$dynamicSize, $enabledBufferOptimization = this.$enabledBufferOptimization, $cacheVersion = this.$cacheVersion;
|
|
1390
1409
|
$isVertical.pipe(takeUntilDestroyed(), tap(v => {
|
|
1391
1410
|
this._isVertical = v;
|
|
@@ -1414,11 +1433,14 @@ class NgVirtualListComponent {
|
|
|
1414
1433
|
if (!this.isScrolling && dynamicSize && container) {
|
|
1415
1434
|
actualScrollSize = scrollSize + delta;
|
|
1416
1435
|
if (snapToItem) {
|
|
1417
|
-
|
|
1436
|
+
const targetItem = this._trackBox.getNearestItem(actualScrollSize, items, itemSize, isVertical);
|
|
1437
|
+
if (targetItem) {
|
|
1438
|
+
this.scrollTo(targetItem.id, BEHAVIOR_INSTANT);
|
|
1439
|
+
}
|
|
1418
1440
|
}
|
|
1419
1441
|
else if (scrollSize !== actualScrollSize) {
|
|
1420
1442
|
const params = {
|
|
1421
|
-
[
|
|
1443
|
+
[isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,
|
|
1422
1444
|
behavior: BEHAVIOR_INSTANT
|
|
1423
1445
|
};
|
|
1424
1446
|
this.scrollImmediately(container, params);
|
|
@@ -1450,6 +1472,9 @@ class NgVirtualListComponent {
|
|
|
1450
1472
|
const dir = d || this.direction;
|
|
1451
1473
|
return isDirection(dir, Directions.VERTICAL);
|
|
1452
1474
|
}
|
|
1475
|
+
_componentsResizeObserver = new ResizeObserver(() => {
|
|
1476
|
+
this._trackBox.changes();
|
|
1477
|
+
});
|
|
1453
1478
|
createDisplayComponentsIfNeed(displayItems) {
|
|
1454
1479
|
if (!displayItems || !this._listContainerRef) {
|
|
1455
1480
|
this._trackBox.setDisplayObjectIndexMapById({});
|
|
@@ -1461,15 +1486,19 @@ class NgVirtualListComponent {
|
|
|
1461
1486
|
if (_listContainerRef) {
|
|
1462
1487
|
const comp = _listContainerRef.createComponent(NgVirtualListItemComponent);
|
|
1463
1488
|
this._displayComponents.push(comp);
|
|
1489
|
+
this._componentsResizeObserver.observe(comp.instance.element);
|
|
1464
1490
|
}
|
|
1465
1491
|
}
|
|
1466
1492
|
const maxLength = displayItems.length;
|
|
1467
1493
|
while (this._displayComponents.length > maxLength) {
|
|
1468
1494
|
const comp = this._displayComponents.pop();
|
|
1469
|
-
comp
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1495
|
+
if (comp) {
|
|
1496
|
+
this._componentsResizeObserver.unobserve(comp.instance.element);
|
|
1497
|
+
comp.destroy();
|
|
1498
|
+
const id = comp?.instance.item?.id;
|
|
1499
|
+
if (id !== undefined) {
|
|
1500
|
+
this._trackBox.untrackComponentByIdProperty(comp?.instance);
|
|
1501
|
+
}
|
|
1473
1502
|
}
|
|
1474
1503
|
}
|
|
1475
1504
|
this.resetRenderers();
|
|
@@ -1620,15 +1649,18 @@ class NgVirtualListComponent {
|
|
|
1620
1649
|
if (this._isScrollingDebounces) {
|
|
1621
1650
|
this._isScrollingDebounces.dispose();
|
|
1622
1651
|
}
|
|
1652
|
+
if (this._componentsResizeObserver) {
|
|
1653
|
+
this._componentsResizeObserver.disconnect();
|
|
1654
|
+
}
|
|
1655
|
+
if (this._resizeObserver) {
|
|
1656
|
+
this._resizeObserver.disconnect();
|
|
1657
|
+
}
|
|
1623
1658
|
const containerEl = this._container;
|
|
1624
1659
|
if (containerEl) {
|
|
1625
1660
|
containerEl.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);
|
|
1626
1661
|
containerEl.nativeElement.removeEventListener(SCROLL_END, this._onScrollEndHandler);
|
|
1627
1662
|
containerEl.nativeElement.removeEventListener(SCROLL, this._onContainerScrollHandler);
|
|
1628
1663
|
containerEl.nativeElement.removeEventListener(SCROLL_END, this._onContainerScrollEndHandler);
|
|
1629
|
-
if (this._resizeObserver) {
|
|
1630
|
-
this._resizeObserver.unobserve(containerEl.nativeElement);
|
|
1631
|
-
}
|
|
1632
1664
|
}
|
|
1633
1665
|
if (this._displayComponents) {
|
|
1634
1666
|
while (this._displayComponents.length > 0) {
|
|
@@ -1638,7 +1670,7 @@ class NgVirtualListComponent {
|
|
|
1638
1670
|
}
|
|
1639
1671
|
}
|
|
1640
1672
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgVirtualListComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1641
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgVirtualListComponent, selector: "ng-virtual-list", inputs: { items: "items", snap: "snap", snapToItem: "snapToItem", enabledBufferOptimization: "enabledBufferOptimization", itemRenderer: "itemRenderer", stickyMap: "stickyMap", itemSize: "itemSize", dynamicSize: "dynamicSize", direction: "direction", itemsOffset: "itemsOffset" }, outputs: { onScroll: "onScroll", onScrollEnd: "onScrollEnd" }, viewQueries: [{ propertyName: "_listContainerRef", first: true, predicate: ["renderersContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_container", first: true, predicate: ["container"], descendants: true, read: (ElementRef) }, { propertyName: "_list", first: true, predicate: ["list"], descendants: true, read: (ElementRef) }], ngImport: i0, template: "<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>", styles: [":host{display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__container{overflow:auto;width:100%;height:100%}.ngvl__list{position:relative;list-style:none;padding:0;margin:0;width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom });
|
|
1673
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgVirtualListComponent, selector: "ng-virtual-list", inputs: { items: "items", snap: "snap", snapToItem: "snapToItem", enabledBufferOptimization: "enabledBufferOptimization", itemRenderer: "itemRenderer", stickyMap: "stickyMap", itemSize: "itemSize", dynamicSize: "dynamicSize", direction: "direction", itemsOffset: "itemsOffset", trackBy: "trackBy" }, outputs: { onScroll: "onScroll", onScrollEnd: "onScrollEnd" }, viewQueries: [{ propertyName: "_listContainerRef", first: true, predicate: ["renderersContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_container", first: true, predicate: ["container"], descendants: true, read: (ElementRef) }, { propertyName: "_list", first: true, predicate: ["list"], descendants: true, read: (ElementRef) }], ngImport: i0, template: "<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>", styles: [":host{display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__container{overflow:auto;width:100%;height:100%}.ngvl__list{position:relative;list-style:none;padding:0;margin:0;width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom });
|
|
1642
1674
|
}
|
|
1643
1675
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgVirtualListComponent, decorators: [{
|
|
1644
1676
|
type: Component,
|
|
@@ -1676,6 +1708,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1676
1708
|
type: Input
|
|
1677
1709
|
}], itemsOffset: [{
|
|
1678
1710
|
type: Input
|
|
1711
|
+
}], trackBy: [{
|
|
1712
|
+
type: Input
|
|
1679
1713
|
}] } });
|
|
1680
1714
|
|
|
1681
1715
|
class NgVirtualListModule {
|