ng-virtual-list 0.2.4 → 0.3.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 +4 -4
- package/fesm2022/ng-virtual-list.mjs +115 -81
- package/fesm2022/ng-virtual-list.mjs.map +1 -1
- package/lib/const/index.d.ts +1 -0
- package/lib/enums/direction.d.ts +2 -0
- package/lib/enums/directions.d.ts +4 -0
- package/lib/enums/index.d.ts +4 -0
- package/lib/models/render-item-config.model.d.ts +2 -1
- package/lib/models/render-item.model.d.ts +1 -1
- package/lib/ng-virtual-list.component.d.ts +7 -3
- package/lib/utils/index.d.ts +3 -0
- package/lib/utils/isDirection.d.ts +2 -0
- package/lib/utils/toggleClassName.d.ts +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ npm i ng-virtual-list
|
|
|
18
18
|
|
|
19
19
|
Template:
|
|
20
20
|
```html
|
|
21
|
-
<ng-virtual-list class="list simple" [items]="items" [itemRenderer]="itemRenderer" [
|
|
21
|
+
<ng-virtual-list class="list simple" [items]="items" [itemRenderer]="itemRenderer" [itemSize]="40"></ng-virtual-list>
|
|
22
22
|
|
|
23
23
|
<ng-template #itemRenderer let-data="data">
|
|
24
24
|
@if (data) {
|
|
@@ -58,7 +58,7 @@ export class AppComponent {
|
|
|
58
58
|
Template:
|
|
59
59
|
```html
|
|
60
60
|
<ng-virtual-list class="list simple" [items]="groupItems" [itemRenderer]="groupItemRenderer"
|
|
61
|
-
[stickyMap]="groupItemsStickyMap" [
|
|
61
|
+
[stickyMap]="groupItemsStickyMap" [itemSize]="40" [snap]="false"></ng-virtual-list>
|
|
62
62
|
|
|
63
63
|
<ng-template #groupItemRenderer let-data="data">
|
|
64
64
|
@if (data) {
|
|
@@ -85,7 +85,7 @@ Template:
|
|
|
85
85
|
Template (with snapping):
|
|
86
86
|
```html
|
|
87
87
|
<ng-virtual-list class="list simple" [items]="groupItems" [itemRenderer]="groupItemRenderer"
|
|
88
|
-
[stickyMap]="groupItemsStickyMap" [
|
|
88
|
+
[stickyMap]="groupItemsStickyMap" [itemSize]="40" [snap]="true"></ng-virtual-list>
|
|
89
89
|
|
|
90
90
|
<ng-template #groupItemRenderer let-data="data">
|
|
91
91
|
@if (data) {
|
|
@@ -144,7 +144,7 @@ Inputs
|
|
|
144
144
|
| Property | Type | Description |
|
|
145
145
|
|---|---|---|
|
|
146
146
|
| 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 |
|
|
147
|
-
|
|
|
147
|
+
| itemSize | number | If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element |
|
|
148
148
|
| itemRenderer | TemplateRef | Rendering element template |
|
|
149
149
|
| 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 |
|
|
150
150
|
| snap | boolean? | Determines whether elements will snap. Default value is "true" |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, Component, viewChild, output, input, ViewContainerRef, ViewChild, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { signal, Component, viewChild, output, input, inject, ElementRef, ViewContainerRef, ViewChild, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
5
5
|
import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
@@ -19,35 +19,52 @@ class NgVirtualListItemComponent {
|
|
|
19
19
|
this._elementRef = _elementRef;
|
|
20
20
|
toObservable(this.data).pipe(takeUntilDestroyed(), filter(data => !!data), tap(data => {
|
|
21
21
|
const styles = this._elementRef.nativeElement.style;
|
|
22
|
-
|
|
23
|
-
if (data.config.snap) {
|
|
24
|
-
styles.position = 'sticky';
|
|
25
|
-
}
|
|
26
|
-
styles.zIndex = String(data.config.sticky);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
if (data.config.snap) {
|
|
30
|
-
styles.position = 'absolute';
|
|
31
|
-
}
|
|
32
|
-
styles.zIndex = String(data.config.sticky ?? 1);
|
|
33
|
-
}
|
|
22
|
+
styles.zIndex = data.config.sticky > 1 ? String(data.config.sticky) : String(data.config.sticky ?? 1);
|
|
34
23
|
if (!data.config.snap) {
|
|
35
24
|
styles.position = 'absolute';
|
|
36
25
|
}
|
|
37
|
-
|
|
38
|
-
|
|
26
|
+
else {
|
|
27
|
+
styles.position = data.config.sticky > 1 ? 'sticky' : 'absolute';
|
|
28
|
+
}
|
|
29
|
+
styles.transform = `translate3d(${data.config.isVertical ? 0 : data.measures.x}px, ${data.config.isVertical ? data.measures.y : 0}px , 0)`;
|
|
30
|
+
styles.height = data.config.isVertical ? `${data.measures.height}px` : '100%';
|
|
31
|
+
styles.width = data.config.isVertical ? '100%' : `${data.measures.width}px`;
|
|
39
32
|
})).subscribe();
|
|
40
33
|
}
|
|
41
34
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
42
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: NgVirtualListItemComponent, isStandalone: true, selector: "ng-virtual-list-item", ngImport: i0, template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem 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{position:absolute;top:0;width:100%}.ngvl-item__container{margin:0;padding:0;overflow:hidden;background-color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
35
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: NgVirtualListItemComponent, isStandalone: true, selector: "ng-virtual-list-item", ngImport: i0, template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem 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{position:absolute;left:0;top:0;width:100%;height:100%}.ngvl-item__container{margin:0;padding:0;overflow:hidden;background-color:#fff;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
43
36
|
}
|
|
44
37
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListItemComponent, decorators: [{
|
|
45
38
|
type: Component,
|
|
46
|
-
args: [{ selector: 'ng-virtual-list-item', imports: [CommonModule], template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem 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{position:absolute;top:0;width:100%}.ngvl-item__container{margin:0;padding:0;overflow:hidden;background-color:#fff}\n"] }]
|
|
39
|
+
args: [{ selector: 'ng-virtual-list-item', imports: [CommonModule], template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem 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{position:absolute;left:0;top:0;width:100%;height:100%}.ngvl-item__container{margin:0;padding:0;overflow:hidden;background-color:#fff;width:100%;height:100%}\n"] }]
|
|
47
40
|
}], ctorParameters: () => [{ type: i0.ElementRef }] });
|
|
48
41
|
|
|
49
42
|
const DEFAULT_ITEM_HEIGHT = 24;
|
|
50
43
|
const DEFAULT_ITEMS_OFFSET = 1;
|
|
44
|
+
const DEFAULT_LIST_SIZE = 400;
|
|
45
|
+
|
|
46
|
+
var Directions;
|
|
47
|
+
(function (Directions) {
|
|
48
|
+
Directions["HORIZONTAL"] = "horizontal";
|
|
49
|
+
Directions["VERTICAL"] = "vertical";
|
|
50
|
+
})(Directions || (Directions = {}));
|
|
51
|
+
|
|
52
|
+
const HORIZONTAL_ALIASES = [Directions.HORIZONTAL, 'horizontal'], VERTICAL_ALIASES = [Directions.VERTICAL, 'vertical'];
|
|
53
|
+
const isDirection = (src, expected) => {
|
|
54
|
+
if (HORIZONTAL_ALIASES.includes(expected)) {
|
|
55
|
+
return HORIZONTAL_ALIASES.includes(src);
|
|
56
|
+
}
|
|
57
|
+
return VERTICAL_ALIASES.includes(src);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const toggleClassName = (el, className, remove = false) => {
|
|
61
|
+
if (!el.classList.contains(className)) {
|
|
62
|
+
el.classList.add(className);
|
|
63
|
+
}
|
|
64
|
+
else if (remove) {
|
|
65
|
+
el.classList.remove(className);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
51
68
|
|
|
52
69
|
class NgVirtualListComponent {
|
|
53
70
|
_listContainerRef;
|
|
@@ -59,7 +76,9 @@ class NgVirtualListComponent {
|
|
|
59
76
|
snap = input(true);
|
|
60
77
|
itemRenderer = input.required();
|
|
61
78
|
stickyMap = input({});
|
|
62
|
-
|
|
79
|
+
itemSize = input(DEFAULT_ITEM_HEIGHT);
|
|
80
|
+
direction = input(Directions.VERTICAL);
|
|
81
|
+
_isVertical = this.getIsVertical();
|
|
63
82
|
_itemsOffset = signal(DEFAULT_ITEMS_OFFSET);
|
|
64
83
|
_displayItems = signal(null);
|
|
65
84
|
_displayComponents = [];
|
|
@@ -71,83 +90,94 @@ class NgVirtualListComponent {
|
|
|
71
90
|
};
|
|
72
91
|
_onScrollHandler = (e) => {
|
|
73
92
|
const target = e.target;
|
|
74
|
-
this._scrollSize.set(target.scrollTop);
|
|
93
|
+
this._scrollSize.set(this._isVertical ? target.scrollTop : target.scrollLeft);
|
|
75
94
|
this.onScroll.emit(e);
|
|
76
95
|
};
|
|
77
96
|
_onScrollEndHandler = (e) => {
|
|
78
97
|
this.onScrollEnd.emit(e);
|
|
79
98
|
};
|
|
80
|
-
|
|
99
|
+
_elementRef = inject((ElementRef));
|
|
100
|
+
// for dynamic item size
|
|
101
|
+
// private _sizeCacheMap = new Map<Id, IRect>();
|
|
81
102
|
constructor() {
|
|
82
|
-
const $bounds = toObservable(this._bounds).pipe(filter(b => !!b)), $items = toObservable(this.items).pipe(map(i => !i ? [] : i)), $scrollSize = toObservable(this._scrollSize), $
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
103
|
+
const $bounds = toObservable(this._bounds).pipe(filter(b => !!b)), $items = toObservable(this.items).pipe(map(i => !i ? [] : i)), $scrollSize = toObservable(this._scrollSize), $itemSize = toObservable(this.itemSize), $itemsOffset = toObservable(this._itemsOffset), $stickyMap = toObservable(this.stickyMap), $snap = toObservable(this.snap), $isVertical = toObservable(this.direction).pipe(map(v => this.getIsVertical()), tap(v => {
|
|
104
|
+
this._isVertical = v;
|
|
105
|
+
const el = this._elementRef.nativeElement;
|
|
106
|
+
toggleClassName(el, v ? 'vertical' : 'horizontal');
|
|
107
|
+
}));
|
|
108
|
+
combineLatest([$bounds, $items, $stickyMap, $scrollSize, $itemSize, $itemsOffset, $snap, $isVertical]).pipe(takeUntilDestroyed(), switchMap(([bounds, items, stickyMap, scrollSize, itemSize, itemsOffset, snap, isVertical]) => {
|
|
109
|
+
const { width, height } = bounds, size = isVertical ? height : width;
|
|
110
|
+
const itemsFromStartToScrollEnd = Math.floor(scrollSize / itemSize), itemsFromStartToDisplayEnd = Math.ceil((scrollSize + size) / itemSize), leftHiddenItemsWeight = itemsFromStartToScrollEnd * itemSize, totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * itemSize, totalItems = items.length, totalSize = totalItems * itemSize, itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight;
|
|
86
111
|
return of({
|
|
87
|
-
items, stickyMap, itemsOffset, width, scrollSize, itemsFromStartToScrollEnd, itemsFromStartToDisplayEnd,
|
|
88
|
-
itemsOnDisplay, leftHiddenItemsWeight,
|
|
112
|
+
items, stickyMap, itemsOffset, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd, itemsFromStartToDisplayEnd,
|
|
113
|
+
itemsOnDisplay, leftHiddenItemsWeight, itemSize, totalSize, snap
|
|
89
114
|
});
|
|
90
|
-
}), tap(({ items, stickyMap, itemsOffset, width, scrollSize, itemsFromStartToScrollEnd, itemsFromStartToDisplayEnd, itemsOnDisplay, leftHiddenItemsWeight,
|
|
91
|
-
const displayItems = []
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
115
|
+
}), tap(({ items, stickyMap, itemsOffset, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd, itemsFromStartToDisplayEnd, itemsOnDisplay, leftHiddenItemsWeight, itemSize, totalSize, snap }) => {
|
|
116
|
+
const displayItems = [];
|
|
117
|
+
if (items.length) {
|
|
118
|
+
const w = isVertical ? width : itemSize, h = isVertical ? itemSize : height, totalItems = items.length, leftItemLength = itemsFromStartToScrollEnd - itemsOffset < Math.min(itemsFromStartToScrollEnd, itemsOffset) ? 0 : itemsOffset, rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalItems
|
|
119
|
+
? totalItems - itemsFromStartToDisplayEnd : itemsOffset, leftItemsWeight = leftItemLength * itemSize, rightItemsWeight = rightItemLength * itemSize, startIndex = itemsFromStartToScrollEnd - leftItemLength;
|
|
120
|
+
let pos = leftHiddenItemsWeight - leftItemsWeight, renderWeight = itemsOnDisplay + leftItemsWeight + rightItemsWeight, stickyItem;
|
|
121
|
+
if (snap) {
|
|
122
|
+
for (let i = startIndex; i >= 0; i--) {
|
|
123
|
+
const id = items[i].id, sticky = stickyMap[id];
|
|
124
|
+
if (sticky > 0) {
|
|
125
|
+
const measures = {
|
|
126
|
+
x: isVertical ? 0 : scrollSize,
|
|
127
|
+
y: isVertical ? scrollSize : 0,
|
|
128
|
+
width: w,
|
|
129
|
+
height: h,
|
|
130
|
+
}, config = {
|
|
131
|
+
isVertical,
|
|
132
|
+
sticky,
|
|
133
|
+
snap,
|
|
134
|
+
};
|
|
135
|
+
const itemData = items[i]; // { ...items[i] };
|
|
136
|
+
stickyItem = { id, measures, data: itemData, config };
|
|
137
|
+
displayItems.push(stickyItem);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
112
140
|
}
|
|
113
141
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
142
|
+
let i = startIndex, nextSticky;
|
|
143
|
+
while (renderWeight > 0) {
|
|
144
|
+
if (i >= totalItems) {
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
const id = items[i].id, snaped = snap && stickyMap[id] > 0 && pos <= scrollSize, measures = {
|
|
148
|
+
x: isVertical ? 0 : snaped ? scrollSize : pos,
|
|
149
|
+
y: isVertical ? snaped ? scrollSize : pos : 0,
|
|
150
|
+
width: w,
|
|
151
|
+
height: h,
|
|
152
|
+
}, config = {
|
|
153
|
+
isVertical,
|
|
154
|
+
sticky: snaped ? stickyMap[id] : 0,
|
|
155
|
+
snap,
|
|
156
|
+
};
|
|
157
|
+
const itemData = items[i]; // { ...items[i] };
|
|
158
|
+
const item = { id, measures, data: itemData, config };
|
|
159
|
+
if (!nextSticky && stickyMap[id] > 0) {
|
|
160
|
+
nextSticky = item;
|
|
161
|
+
}
|
|
162
|
+
displayItems.push(item);
|
|
163
|
+
// for dynamic item size
|
|
164
|
+
// this._sizeCacheMap.set(id, measures);
|
|
165
|
+
renderWeight -= itemSize;
|
|
166
|
+
pos += itemSize;
|
|
167
|
+
i++;
|
|
134
168
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (i < totalItems) {
|
|
142
|
-
if (nextSticky && stickyItem && nextSticky.measures.y <= leftHiddenItemsWeight + itemHeight) {
|
|
143
|
-
stickyItem.measures.y = nextSticky.measures.y - itemHeight;
|
|
144
|
-
stickyItem.config.sticky = 1;
|
|
169
|
+
const axis = isVertical ? 'y' : 'x';
|
|
170
|
+
if (i < totalItems) {
|
|
171
|
+
if (nextSticky && stickyItem && nextSticky.measures[axis] <= leftHiddenItemsWeight + itemSize) {
|
|
172
|
+
stickyItem.measures[axis] = nextSticky.measures[axis] - itemSize;
|
|
173
|
+
stickyItem.config.sticky = 1;
|
|
174
|
+
}
|
|
145
175
|
}
|
|
146
176
|
}
|
|
147
177
|
this._displayItems.set(displayItems);
|
|
148
178
|
const l = this._list();
|
|
149
179
|
if (l) {
|
|
150
|
-
l.nativeElement.style
|
|
180
|
+
l.nativeElement.style[isVertical ? 'height' : 'width'] = `${totalSize}px`;
|
|
151
181
|
}
|
|
152
182
|
})).subscribe();
|
|
153
183
|
toObservable(this._displayItems).pipe(takeUntilDestroyed(), tap(displayItems => {
|
|
@@ -155,6 +185,10 @@ class NgVirtualListComponent {
|
|
|
155
185
|
this.refresh(displayItems);
|
|
156
186
|
})).subscribe();
|
|
157
187
|
}
|
|
188
|
+
getIsVertical() {
|
|
189
|
+
const dir = this.direction();
|
|
190
|
+
return isDirection(dir, Directions.VERTICAL);
|
|
191
|
+
}
|
|
158
192
|
createdisplayComponentsIfNeed(displayItems) {
|
|
159
193
|
if (!displayItems || !this._listContainerRef) {
|
|
160
194
|
return;
|
|
@@ -204,11 +238,11 @@ class NgVirtualListComponent {
|
|
|
204
238
|
}
|
|
205
239
|
}
|
|
206
240
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
207
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.14", type: NgVirtualListComponent, isStandalone: true, selector: "ng-virtual-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, snap: { classPropertyName: "snap", publicName: "snap", isSignal: true, isRequired: false, transformFunction: null }, itemRenderer: { classPropertyName: "itemRenderer", publicName: "itemRenderer", isSignal: true, isRequired: true, transformFunction: null }, stickyMap: { classPropertyName: "stickyMap", publicName: "stickyMap", isSignal: true, isRequired: false, transformFunction: null },
|
|
241
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.14", type: NgVirtualListComponent, isStandalone: true, selector: "ng-virtual-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, snap: { classPropertyName: "snap", publicName: "snap", isSignal: true, isRequired: false, transformFunction: null }, itemRenderer: { classPropertyName: "itemRenderer", publicName: "itemRenderer", isSignal: true, isRequired: true, transformFunction: null }, stickyMap: { classPropertyName: "stickyMap", publicName: "stickyMap", isSignal: true, isRequired: false, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onScroll: "onScroll", onScrollEnd: "onScrollEnd" }, viewQueries: [{ propertyName: "_container", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "_list", first: true, predicate: ["list"], descendants: true, isSignal: true }, { propertyName: "_listContainerRef", first: true, predicate: ["renderersContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<div #container class=\"ngvl__container\">\r\n <ul #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"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom });
|
|
208
242
|
}
|
|
209
243
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListComponent, decorators: [{
|
|
210
244
|
type: Component,
|
|
211
|
-
args: [{ selector: 'ng-virtual-list', imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, template: "<div #container class=\"ngvl__container\">\r\n <ul #list class=\"ngvl__list\">\r\n <ng-container #renderersContainer></ng-container>\r\n </ul>\r\n</div>", styles: [":host{display:block;
|
|
245
|
+
args: [{ selector: 'ng-virtual-list', imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, template: "<div #container class=\"ngvl__container\">\r\n <ul #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"] }]
|
|
212
246
|
}], ctorParameters: () => [], propDecorators: { _listContainerRef: [{
|
|
213
247
|
type: ViewChild,
|
|
214
248
|
args: ['renderersContainer', { read: ViewContainerRef }]
|
|
@@ -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/const/index.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 { Component, ElementRef, signal, TemplateRef } from '@angular/core';\r\nimport { IRenderVirtualListItem } from '../models/render-item.model';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { filter, tap } from 'rxjs';\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})\r\nexport class NgVirtualListItemComponent {\r\n data = signal<IRenderVirtualListItem | undefined>(undefined);\r\n\r\n set item(v: IRenderVirtualListItem | undefined) {\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 constructor(private _elementRef: ElementRef<HTMLElement>) {\r\n toObservable(this.data).pipe(\r\n takeUntilDestroyed(),\r\n filter(data => !!data),\r\n tap(data => {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (data.config.sticky > 1) {\r\n if (data.config.snap) {\r\n styles.position = 'sticky';\r\n }\r\n styles.zIndex = String(data.config.sticky);\r\n } else {\r\n if (data.config.snap) {\r\n styles.position = 'absolute';\r\n }\r\n styles.zIndex = String(data.config.sticky ?? 1);\r\n }\r\n if (!data.config.snap) {\r\n styles.position = 'absolute';\r\n }\r\n styles.transform = `translate3d(0, ${data.measures.y}px , 0)`;\r\n styles.height = `${data.measures.height}px`;\r\n })\r\n ).subscribe();\r\n }\r\n}\r\n","@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem 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 const DEFAULT_ITEM_HEIGHT = 24;\r\n\r\nexport const DEFAULT_ITEMS_OFFSET = 1;","import {\r\n AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, ElementRef, 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 { combineLatest, filter, map, of, switchMap, tap } from 'rxjs';\r\nimport { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';\r\nimport { DEFAULT_ITEM_HEIGHT, DEFAULT_ITEMS_OFFSET } from './const';\r\nimport { IVirtualListCollection, 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\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 @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 onScroll = output<Event>();\r\n\r\n onScrollEnd = output<Event>();\r\n\r\n items = input.required<IVirtualListCollection>();\r\n\r\n snap = input<boolean>(true);\r\n\r\n itemRenderer = input.required<TemplateRef<any>>();\r\n\r\n stickyMap = input<IVirtualListStickyMap>({});\r\n\r\n itemHeight = input(DEFAULT_ITEM_HEIGHT);\r\n\r\n protected _itemsOffset = signal<number>(DEFAULT_ITEMS_OFFSET);\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 this._scrollSize.set(target.scrollTop);\r\n\r\n this.onScroll.emit(e);\r\n }\r\n\r\n private _onScrollEndHandler = (e: Event) => {\r\n this.onScrollEnd.emit(e);\r\n }\r\n\r\n private _sizeCacheMap = new Map<Id, IRect>();\r\n\r\n constructor() {\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 $itemHeight = toObservable(this.itemHeight),\r\n $itemsOffset = toObservable(this._itemsOffset),\r\n $stickyMap = toObservable(this.stickyMap),\r\n $snap = toObservable(this.snap);\r\n\r\n combineLatest([$bounds, $items, $stickyMap, $scrollSize, $itemHeight, $itemsOffset, $snap]).pipe(\r\n takeUntilDestroyed(),\r\n switchMap(([bounds, items, stickyMap, scrollSize, itemHeight, itemsOffset, snap]) => {\r\n const { width, height } = bounds;\r\n const itemsFromStartToScrollEnd = Math.floor(scrollSize / itemHeight),\r\n itemsFromStartToDisplayEnd = Math.ceil((scrollSize + height) / itemHeight),\r\n leftHiddenItemsWeight = itemsFromStartToScrollEnd * itemHeight,\r\n totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * itemHeight,\r\n totalItems = items.length,\r\n totalSize = totalItems * itemHeight,\r\n itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight;\r\n return of({\r\n items, stickyMap, itemsOffset, width, scrollSize, itemsFromStartToScrollEnd, itemsFromStartToDisplayEnd,\r\n itemsOnDisplay, leftHiddenItemsWeight, itemHeight, totalSize, snap\r\n });\r\n }),\r\n tap(({ items, stickyMap, itemsOffset, width, scrollSize, itemsFromStartToScrollEnd, itemsFromStartToDisplayEnd,\r\n itemsOnDisplay, leftHiddenItemsWeight, itemHeight, totalSize, snap }) => {\r\n const displayItems: IRenderVirtualListCollection = [], totalItems = items.length,\r\n leftItemLength = itemsFromStartToScrollEnd - itemsOffset < Math.min(itemsFromStartToScrollEnd, itemsOffset) ? 0 : itemsOffset,\r\n rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalItems\r\n ? totalItems - itemsFromStartToDisplayEnd : itemsOffset,\r\n leftItemsWeight = leftItemLength * itemHeight, rightItemsWeight = rightItemLength * itemHeight,\r\n startIndex = itemsFromStartToScrollEnd - leftItemLength;\r\n let y = leftHiddenItemsWeight - leftItemsWeight,\r\n renderWeight = itemsOnDisplay + leftItemsWeight + rightItemsWeight, stickyItem: IRenderVirtualListItem | undefined;\r\n\r\n if (snap) {\r\n for (let i = startIndex; i >= 0; i--) {\r\n const id = items[i].id, sticky = stickyMap[id];\r\n if (sticky > 0) {\r\n const measures = {\r\n x: 0,\r\n y: scrollSize,\r\n width,\r\n height: itemHeight,\r\n }, config = {\r\n sticky,\r\n snap,\r\n };\r\n\r\n const itemData: any = { ...items[i] };\r\n delete itemData.id;\r\n\r\n stickyItem = { id, measures, data: itemData, config };\r\n\r\n displayItems.push(stickyItem);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let i = startIndex, nextSticky: IRenderVirtualListItem | undefined;\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, snaped = snap && stickyMap[id] > 0 && y <= scrollSize, measures = {\r\n x: 0,\r\n y: snaped ? scrollSize : y,\r\n width,\r\n height: itemHeight,\r\n }, config = {\r\n sticky: snaped ? stickyMap[id] : 0,\r\n snap,\r\n };\r\n\r\n const itemData: any = { ...items[i] };\r\n delete itemData.id;\r\n\r\n const item: IRenderVirtualListItem = { id, measures, data: itemData, config };\r\n if (!nextSticky && stickyMap[id] > 0) {\r\n nextSticky = item;\r\n }\r\n\r\n displayItems.push(item);\r\n\r\n this._sizeCacheMap.set(id, measures);\r\n\r\n renderWeight -= itemHeight;\r\n y += itemHeight;\r\n i++;\r\n }\r\n\r\n if (i < totalItems) {\r\n if (nextSticky && stickyItem && nextSticky.measures.y <= leftHiddenItemsWeight + itemHeight) {\r\n stickyItem.measures.y = nextSticky.measures.y - itemHeight;\r\n stickyItem.config.sticky = 1;\r\n }\r\n }\r\n\r\n this._displayItems.set(displayItems);\r\n\r\n const l = this._list();\r\n if (l) {\r\n l.nativeElement.style.height = `${totalSize}px`;\r\n }\r\n\r\n })\r\n ).subscribe();\r\n\r\n toObservable(this._displayItems).pipe(\r\n takeUntilDestroyed(),\r\n tap(displayItems => {\r\n this.createdisplayComponentsIfNeed(displayItems);\r\n this.refresh(displayItems);\r\n }),\r\n ).subscribe();\r\n }\r\n\r\n private createdisplayComponentsIfNeed(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems || !this._listContainerRef) {\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 if (this._displayComponents.length > displayItems.length) {\r\n while (this._displayComponents.length > displayItems.length) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n }\r\n }\r\n\r\n protected refresh(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems) {\r\n return;\r\n }\r\n\r\n for (let i = 0, l = displayItems.length; i < l; i++) {\r\n const el = this._displayComponents[i];\r\n el.instance.item = displayItems[i];\r\n el.instance.renderer = this.itemRenderer();\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 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}\r\n","<div #container class=\"ngvl__container\">\r\n <ul #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\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/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/const/index.ts","../../../projects/ng-virtual-list/src/lib/enums/directions.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/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 { Component, ElementRef, signal, TemplateRef } from '@angular/core';\r\nimport { IRenderVirtualListItem } from '../models/render-item.model';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { filter, tap } from 'rxjs';\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})\r\nexport class NgVirtualListItemComponent {\r\n data = signal<IRenderVirtualListItem | undefined>(undefined);\r\n\r\n set item(v: IRenderVirtualListItem | undefined) {\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 constructor(private _elementRef: ElementRef<HTMLElement>) {\r\n toObservable(this.data).pipe(\r\n takeUntilDestroyed(),\r\n filter(data => !!data),\r\n tap(data => {\r\n const styles = this._elementRef.nativeElement.style;\r\n styles.zIndex = data.config.sticky > 1 ? String(data.config.sticky) : String(data.config.sticky ?? 1);\r\n if (!data.config.snap) {\r\n styles.position = 'absolute';\r\n } else {\r\n styles.position = data.config.sticky > 1 ? 'sticky' : 'absolute';\r\n }\r\n styles.transform = `translate3d(${data.config.isVertical ? 0 : data.measures.x}px, ${data.config.isVertical ? data.measures.y : 0}px , 0)`;\r\n styles.height = data.config.isVertical ? `${data.measures.height}px` : '100%';\r\n styles.width = data.config.isVertical ? '100%' : `${data.measures.width}px`;\r\n })\r\n ).subscribe();\r\n }\r\n}\r\n","@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem 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 const DEFAULT_ITEM_HEIGHT = 24;\r\n\r\nexport const DEFAULT_ITEMS_OFFSET = 1;\r\n\r\nexport const DEFAULT_LIST_SIZE = 400;","export enum Directions {\r\n HORIZONTAL = 'horizontal',\r\n VERTICAL = 'vertical',\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 {\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 { combineLatest, filter, map, of, switchMap, tap } from 'rxjs';\r\nimport { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';\r\nimport { DEFAULT_ITEM_HEIGHT, DEFAULT_ITEMS_OFFSET, DEFAULT_LIST_SIZE } from './const';\r\nimport { IVirtualListCollection, IVirtualListItem, IVirtualListStickyMap } from './models';\r\n// import { 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 { isDirection, toggleClassName } from './utils';\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 @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 onScroll = output<Event>();\r\n\r\n onScrollEnd = output<Event>();\r\n\r\n items = input.required<IVirtualListCollection>();\r\n\r\n snap = input<boolean>(true);\r\n\r\n itemRenderer = input.required<TemplateRef<any>>();\r\n\r\n stickyMap = input<IVirtualListStickyMap>({});\r\n\r\n itemSize = input(DEFAULT_ITEM_HEIGHT);\r\n\r\n direction = input<Direction>(Directions.VERTICAL);\r\n\r\n private _isVertical = this.getIsVertical();\r\n\r\n protected _itemsOffset = signal<number>(DEFAULT_ITEMS_OFFSET);\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 this._scrollSize.set(this._isVertical ? target.scrollTop : target.scrollLeft);\r\n\r\n this.onScroll.emit(e);\r\n }\r\n\r\n private _onScrollEndHandler = (e: Event) => {\r\n this.onScrollEnd.emit(e);\r\n }\r\n\r\n private _elementRef = inject(ElementRef<HTMLDivElement>);\r\n\r\n // for dynamic item size\r\n // private _sizeCacheMap = new Map<Id, IRect>();\r\n\r\n constructor() {\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),\r\n $itemsOffset = toObservable(this._itemsOffset),\r\n $stickyMap = toObservable(this.stickyMap),\r\n $snap = toObservable(this.snap),\r\n $isVertical = toObservable(this.direction).pipe(\r\n map(v => this.getIsVertical()),\r\n tap(v => {\r\n this._isVertical = v;\r\n const el: HTMLElement = this._elementRef.nativeElement;\r\n toggleClassName(el, v ? 'vertical' : 'horizontal');\r\n }),\r\n );\r\n\r\n combineLatest([$bounds, $items, $stickyMap, $scrollSize, $itemSize, $itemsOffset, $snap, $isVertical]).pipe(\r\n takeUntilDestroyed(),\r\n switchMap(([bounds, items, stickyMap, scrollSize, itemSize, itemsOffset, snap, isVertical]) => {\r\n const { width, height } = bounds, size = isVertical ? height : width;\r\n const itemsFromStartToScrollEnd = Math.floor(scrollSize / itemSize),\r\n itemsFromStartToDisplayEnd = Math.ceil((scrollSize + size) / itemSize),\r\n leftHiddenItemsWeight = itemsFromStartToScrollEnd * itemSize,\r\n totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * itemSize,\r\n totalItems = items.length,\r\n totalSize = totalItems * itemSize,\r\n itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight;\r\n return of({\r\n items, stickyMap, itemsOffset, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd, itemsFromStartToDisplayEnd,\r\n itemsOnDisplay, leftHiddenItemsWeight, itemSize, totalSize, snap\r\n });\r\n }),\r\n tap(({ items, stickyMap, itemsOffset, width, height, isVertical, scrollSize, itemsFromStartToScrollEnd, itemsFromStartToDisplayEnd,\r\n itemsOnDisplay, leftHiddenItemsWeight, itemSize, totalSize, snap }) => {\r\n const displayItems: IRenderVirtualListCollection = [];\r\n if (items.length) {\r\n const w = isVertical ? width : itemSize, h = isVertical ? itemSize : height, totalItems = items.length,\r\n leftItemLength = itemsFromStartToScrollEnd - itemsOffset < Math.min(itemsFromStartToScrollEnd, itemsOffset) ? 0 : itemsOffset,\r\n rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalItems\r\n ? totalItems - itemsFromStartToDisplayEnd : itemsOffset,\r\n leftItemsWeight = leftItemLength * itemSize, rightItemsWeight = rightItemLength * itemSize,\r\n startIndex = itemsFromStartToScrollEnd - leftItemLength;\r\n let pos = leftHiddenItemsWeight - leftItemsWeight,\r\n renderWeight = itemsOnDisplay + leftItemsWeight + rightItemsWeight, stickyItem: IRenderVirtualListItem | undefined;\r\n\r\n if (snap) {\r\n for (let i = startIndex; i >= 0; i--) {\r\n const id = items[i].id, sticky = stickyMap[id];\r\n if (sticky > 0) {\r\n const measures = {\r\n x: isVertical ? 0 : scrollSize,\r\n y: isVertical ? scrollSize : 0,\r\n width: w,\r\n height: h,\r\n }, config = {\r\n isVertical,\r\n sticky,\r\n snap,\r\n };\r\n\r\n const itemData: IVirtualListItem = items[i]; // { ...items[i] };\r\n\r\n stickyItem = { id, measures, data: itemData, config };\r\n\r\n displayItems.push(stickyItem);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let i = startIndex, nextSticky: IRenderVirtualListItem | undefined;\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, snaped = snap && stickyMap[id] > 0 && pos <= scrollSize, measures = {\r\n x: isVertical ? 0 : snaped ? scrollSize : pos,\r\n y: isVertical ? snaped ? scrollSize : pos : 0,\r\n width: w,\r\n height: h,\r\n }, config = {\r\n isVertical,\r\n sticky: snaped ? stickyMap[id] : 0,\r\n snap,\r\n };\r\n\r\n const itemData: IVirtualListItem = items[i]; // { ...items[i] };\r\n\r\n const item: IRenderVirtualListItem = { id, measures, data: itemData, config };\r\n if (!nextSticky && stickyMap[id] > 0) {\r\n nextSticky = item;\r\n }\r\n\r\n displayItems.push(item);\r\n\r\n // for dynamic item size\r\n // this._sizeCacheMap.set(id, measures);\r\n\r\n renderWeight -= itemSize;\r\n pos += itemSize;\r\n i++;\r\n }\r\n\r\n const axis = isVertical ? 'y' : 'x';\r\n\r\n if (i < totalItems) {\r\n if (nextSticky && stickyItem && nextSticky.measures[axis] <= leftHiddenItemsWeight + itemSize) {\r\n stickyItem.measures[axis] = nextSticky.measures[axis] - itemSize;\r\n stickyItem.config.sticky = 1;\r\n }\r\n }\r\n }\r\n\r\n this._displayItems.set(displayItems);\r\n\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 ).subscribe();\r\n\r\n toObservable(this._displayItems).pipe(\r\n takeUntilDestroyed(),\r\n tap(displayItems => {\r\n this.createdisplayComponentsIfNeed(displayItems);\r\n this.refresh(displayItems);\r\n }),\r\n ).subscribe();\r\n }\r\n\r\n private getIsVertical() {\r\n const dir = 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 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 if (this._displayComponents.length > displayItems.length) {\r\n while (this._displayComponents.length > displayItems.length) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n }\r\n }\r\n\r\n protected refresh(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems) {\r\n return;\r\n }\r\n\r\n for (let i = 0, l = displayItems.length; i < l; i++) {\r\n const el = this._displayComponents[i];\r\n el.instance.item = displayItems[i];\r\n el.instance.renderer = this.itemRenderer();\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 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}\r\n","<div #container class=\"ngvl__container\">\r\n <ul #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\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/lib/const/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { AfterViewInit, ComponentRef, ElementRef, OnDestroy, TemplateRef, ViewCo
|
|
|
2
2
|
import { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';
|
|
3
3
|
import { IVirtualListCollection, IVirtualListStickyMap } from './models';
|
|
4
4
|
import { IRenderVirtualListCollection } from './models/render-collection.model';
|
|
5
|
+
import { Direction } from './enums';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export declare class NgVirtualListComponent implements AfterViewInit, OnDestroy {
|
|
7
8
|
protected _listContainerRef: ViewContainerRef | undefined;
|
|
@@ -13,7 +14,9 @@ export declare class NgVirtualListComponent implements AfterViewInit, OnDestroy
|
|
|
13
14
|
snap: import("@angular/core").InputSignal<boolean>;
|
|
14
15
|
itemRenderer: import("@angular/core").InputSignal<TemplateRef<any>>;
|
|
15
16
|
stickyMap: import("@angular/core").InputSignal<IVirtualListStickyMap>;
|
|
16
|
-
|
|
17
|
+
itemSize: import("@angular/core").InputSignal<number>;
|
|
18
|
+
direction: import("@angular/core").InputSignal<Direction>;
|
|
19
|
+
private _isVertical;
|
|
17
20
|
protected _itemsOffset: import("@angular/core").WritableSignal<number>;
|
|
18
21
|
protected _displayItems: import("@angular/core").WritableSignal<IRenderVirtualListCollection | null>;
|
|
19
22
|
protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>>;
|
|
@@ -23,12 +26,13 @@ export declare class NgVirtualListComponent implements AfterViewInit, OnDestroy
|
|
|
23
26
|
private _onResizeHandler;
|
|
24
27
|
private _onScrollHandler;
|
|
25
28
|
private _onScrollEndHandler;
|
|
26
|
-
private
|
|
29
|
+
private _elementRef;
|
|
27
30
|
constructor();
|
|
31
|
+
private getIsVertical;
|
|
28
32
|
private createdisplayComponentsIfNeed;
|
|
29
33
|
protected refresh(displayItems: IRenderVirtualListCollection | null): void;
|
|
30
34
|
ngAfterViewInit(): void;
|
|
31
35
|
ngOnDestroy(): void;
|
|
32
36
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgVirtualListComponent, never>;
|
|
33
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgVirtualListComponent, "ng-virtual-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "snap": { "alias": "snap"; "required": false; "isSignal": true; }; "itemRenderer": { "alias": "itemRenderer"; "required": true; "isSignal": true; }; "stickyMap": { "alias": "stickyMap"; "required": false; "isSignal": true; }; "
|
|
37
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgVirtualListComponent, "ng-virtual-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "snap": { "alias": "snap"; "required": false; "isSignal": true; }; "itemRenderer": { "alias": "itemRenderer"; "required": true; "isSignal": true; }; "stickyMap": { "alias": "stickyMap"; "required": false; "isSignal": true; }; "itemSize": { "alias": "itemSize"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; }, { "onScroll": "onScroll"; "onScrollEnd": "onScrollEnd"; }, never, never, true, never>;
|
|
34
38
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const toggleClassName: (el: HTMLElement, className: string, remove?: boolean) => void;
|