ng-virtual-list 0.3.6 → 0.4.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 CHANGED
@@ -234,6 +234,124 @@ export class AppComponent {
234
234
 
235
235
  ```
236
236
 
237
+ ### ScrollTo
238
+
239
+ The example demonstrates the scrollTo method by passing it the element id. It is important not to confuse the ordinal index and the element id. In this example, id = index + 1
240
+
241
+ ![NgVirtualList-GoogleChrome2025-06-1512-18-07-ezgif com-video-to-gif-converter](https://github.com/user-attachments/assets/7c860da9-6600-46d2-8aa6-67ee70160fa5)
242
+
243
+ Template
244
+ ```html
245
+ <div class="scroll-to__controls">
246
+ <input type="number" class="scroll-to__input" [(ngModel)]="itemId" [required]="true" [min]="items[0].id"
247
+ [max]="items[items.length - 1].id">
248
+ <button class="scroll-to__button" (click)="onButtonScrollToIdClickHandler($event)">Scroll</button>
249
+ </div>
250
+
251
+ <ng-virtual-list #virtualList class="list" [items]="items" [itemRenderer]="itemRenderer" [itemsOffset]="10"
252
+ [itemSize]="40"></ng-virtual-list>
253
+
254
+ <ng-template #itemRenderer let-data="data">
255
+ @if (data) {
256
+ <div class="list__container">
257
+ <span>{{data.name}}</span>
258
+ </div>
259
+ }
260
+ </ng-template>
261
+ ```
262
+
263
+ Component
264
+ ```ts
265
+ import { Component, viewChild } from '@angular/core';
266
+ import { NgVirtualListComponent } from '../../projects/ng-virtual-list/src/public-api';
267
+ import { IVirtualListCollection } from '../../projects/ng-virtual-list/src/lib/models';
268
+ import { FormsModule } from '@angular/forms';
269
+ import { Id } from '../../projects/ng-virtual-list/src/lib/types';
270
+
271
+ const MAX_ITEMS = 1000000;
272
+
273
+ const ITEMS: IVirtualListCollection = [];
274
+ for (let i = 0, l = MAX_ITEMS; i < l; i++) {
275
+ ITEMS.push({ id: i + 1, name: `Item: ${i}` });
276
+ }
277
+
278
+ @Component({
279
+ selector: 'app-root',
280
+ imports: [FormsModule, NgVirtualListComponent],
281
+ templateUrl: './app.component.html',
282
+ styleUrl: './app.component.scss'
283
+ })
284
+ export class AppComponent {
285
+ protected _listContainerRef = viewChild('virtualList', { read: NgVirtualListComponent });
286
+
287
+ items = ITEMS;
288
+
289
+ itemId: Id = this.items[0].id;
290
+
291
+ onButtonScrollToIdClickHandler = (e: Event) => {
292
+ const list = this._listContainerRef();
293
+ if (list) {
294
+ list.scrollTo(this.itemId, 'smooth');
295
+ }
296
+ }
297
+ }
298
+
299
+ ```
300
+
301
+ ## Stylization
302
+
303
+ List items are encapsulated in shadowDOM, so to override default styles you need to use ::part access
304
+
305
+ - Customize a scroll area of list
306
+ ```css
307
+ .list::part(scroller) {
308
+ scroll-behavior: auto;
309
+
310
+ /* custom scrollbar */
311
+ &::-webkit-scrollbar {
312
+ width: 16px;
313
+ height: 16px;
314
+ }
315
+
316
+ &::-webkit-scrollbar-track {
317
+ background-color: #ffffff;
318
+ }
319
+
320
+ &::-webkit-scrollbar-thumb {
321
+ background-color: #d6dee1;
322
+ border-radius: 20px;
323
+ border: 6px solid transparent;
324
+ background-clip: content-box;
325
+ min-width: 60px;
326
+ min-height: 60px;
327
+ }
328
+
329
+ &::-webkit-scrollbar-thumb:hover {
330
+ background-color: #a8bbbf;
331
+ }
332
+ }
333
+
334
+ .list {
335
+ border-radius: 3px;
336
+ box-shadow: 1px 2px 8px 4px rgba(0, 0, 0, 0.075);
337
+ border: 1px solid rgba(0, 0, 0, 0.1);
338
+ }
339
+ ```
340
+
341
+ - Set up the list item canvas
342
+ ```css
343
+ .list::part(list) {
344
+ background-color: #ffffff;
345
+ }
346
+ ```
347
+
348
+ - Set up the list item
349
+ ```css
350
+ .list::part(item) {
351
+ background-color: unset; // override default styles
352
+ }
353
+ ```
354
+
237
355
  ## API
238
356
 
239
357
  [NgVirtualListComponent](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts)
@@ -242,13 +360,14 @@ Inputs
242
360
 
243
361
  | Property | Type | Description |
244
362
  |---|---|---|
245
- | 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 |
246
- | itemSize | number | If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element |
247
- | itemsOffset | number? | Number of elements outside the scope of visibility. Default value is 2 |
248
- | itemRenderer | TemplateRef | Rendering element template |
249
- | 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 |
250
- | snap | boolean? | Determines whether elements will snap. Default value is "true" |
251
- | direction | [Direction](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/enums/direction.ts) | Determines the direction in which elements are placed. Default value is "vertical" |
363
+ | id | number | Readonly. Returns the unique identifier of the component. |
364
+ | 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. |
365
+ | itemSize | number | If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element. |
366
+ | itemsOffset | number? | Number of elements outside the scope of visibility. Default value is 2. |
367
+ | itemRenderer | TemplateRef | Rendering element template. |
368
+ | 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. |
369
+ | snap | boolean? | Determines whether elements will snap. Default value is "true". |
370
+ | direction | [Direction](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/enums/direction.ts) | Determines the direction in which elements are placed. Default value is "vertical". |
252
371
 
253
372
  <br/>
254
373
 
@@ -256,5 +375,13 @@ Outputs
256
375
 
257
376
  | Event | Type | Description |
258
377
  |---|---|---|
259
- | onScroll | (e: Event) => void | Fires when the list has been scrolled |
378
+ | onScroll | (e: Event) => void | Fires when the list has been scrolled. |
260
379
  | onScrollEnd | (e: Event) => void | Fires when the list has completed scrolling. |
380
+
381
+ <br/>
382
+
383
+ Methods
384
+
385
+ | Method | Type | Description |
386
+ |--|--|--|
387
+ | scrollTo | (id: [Id](https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/types/id.ts), behavior: ScrollBehavior = 'auto') => number | The method scrolls the list to the element with the given id and returns the value of the scrolled area. Behavior accepts the values ​​"auto", "instant" and "smooth". |
@@ -39,13 +39,13 @@ class NgVirtualListItemComponent {
39
39
  styles.visibility = 'hidden';
40
40
  }
41
41
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListItemComponent, deps: [], 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", host: { classAttribute: "ngvl__item" }, ngImport: i0, template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
42
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: NgVirtualListItemComponent, isStandalone: true, selector: "ng-virtual-list-item", host: { classAttribute: "ngvl__item" }, ngImport: i0, template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem part=\"item\" class=\"ngvl-item__container\">\r\n @if (renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\" [ngTemplateOutletContext]=\"{data: item.data || {}}\" />\r\n }\r\n</li>\r\n}", styles: [":host{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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
43
43
  }
44
44
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListItemComponent, decorators: [{
45
45
  type: Component,
46
46
  args: [{ selector: 'ng-virtual-list-item', imports: [CommonModule], host: {
47
47
  'class': 'ngvl__item',
48
- }, changeDetection: ChangeDetectionStrategy.OnPush, 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"] }]
48
+ }, changeDetection: ChangeDetectionStrategy.OnPush, template: "@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem part=\"item\" class=\"ngvl-item__container\">\r\n @if (renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\" [ngTemplateOutletContext]=\"{data: item.data || {}}\" />\r\n }\r\n</li>\r\n}", styles: [":host{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"] }]
49
49
  }], ctorParameters: () => [] });
50
50
 
51
51
  const DEFAULT_ITEM_HEIGHT = 24;
@@ -77,17 +77,51 @@ const toggleClassName = (el, className, remove = false) => {
77
77
  };
78
78
 
79
79
  class NgVirtualListComponent {
80
+ static __nextId = 0;
81
+ _id = NgVirtualListComponent.__nextId;
82
+ /**
83
+ * Readonly. Returns the unique identifier of the component.
84
+ */
85
+ get id() { return this._id; }
80
86
  _listContainerRef;
81
87
  _container = viewChild('container');
82
88
  _list = viewChild('list');
89
+ /**
90
+ * Fires when the list has been scrolled.
91
+ */
83
92
  onScroll = output();
93
+ /**
94
+ * Fires when the list has completed scrolling.
95
+ */
84
96
  onScrollEnd = output();
97
+ /**
98
+ * Collection of list items.
99
+ */
85
100
  items = input.required();
101
+ /**
102
+ * Determines whether elements will snap. Default value is "true".
103
+ */
86
104
  snap = input(true);
105
+ /**
106
+ * Rendering element template.
107
+ */
87
108
  itemRenderer = input.required();
109
+ /**
110
+ * Dictionary zIndex by id of the list element. If the value is not set or equal to 0,
111
+ * then a simple element is displayed, if the value is greater than 0, then the sticky position mode is enabled for the element.
112
+ */
88
113
  stickyMap = input({});
114
+ /**
115
+ * If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element.
116
+ */
89
117
  itemSize = input(DEFAULT_ITEM_HEIGHT);
118
+ /**
119
+ * Determines the direction in which elements are placed. Default value is "vertical".
120
+ */
90
121
  direction = input(Directions.VERTICAL);
122
+ /**
123
+ * Number of elements outside the scope of visibility. Default value is 2.
124
+ */
91
125
  itemsOffset = input(DEFAULT_ITEMS_OFFSET);
92
126
  _isVertical = this.getIsVertical();
93
127
  _displayItems = signal(null);
@@ -110,6 +144,9 @@ class NgVirtualListComponent {
110
144
  // for dynamic item size
111
145
  // private _sizeCacheMap = new Map<Id, IRect>();
112
146
  constructor() {
147
+ NgVirtualListComponent.__nextId = NgVirtualListComponent.__nextId + 1 === Number.MAX_SAFE_INTEGER
148
+ ? 0 : NgVirtualListComponent.__nextId + 1;
149
+ this._id = NgVirtualListComponent.__nextId;
113
150
  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(v)), tap(v => {
114
151
  this._isVertical = v;
115
152
  const el = this._elementRef.nativeElement;
@@ -233,6 +270,21 @@ class NgVirtualListComponent {
233
270
  el.instance.showIfNeed();
234
271
  }
235
272
  }
273
+ /**
274
+ * The method scrolls the list to the element with the given id and returns the value of the scrolled area.
275
+ * Behavior accepts the values ​​"auto", "instant" and "smooth".
276
+ */
277
+ scrollTo(id, behavior = 'auto') {
278
+ const items = this.items();
279
+ if (!items || !items.length) {
280
+ return;
281
+ }
282
+ const index = items.findIndex(item => item.id === id), scrollSize = index * this.itemSize(), container = this._container();
283
+ if (container) {
284
+ const params = { [this._isVertical ? 'top' : 'left']: scrollSize, behavior };
285
+ container.nativeElement.scroll(params);
286
+ }
287
+ }
236
288
  ngAfterViewInit() {
237
289
  const containerEl = this._container();
238
290
  if (containerEl) {
@@ -260,11 +312,11 @@ class NgVirtualListComponent {
260
312
  }
261
313
  }
262
314
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
263
- 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 }, itemsOffset: { classPropertyName: "itemsOffset", publicName: "itemsOffset", 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 });
315
+ 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 }, itemsOffset: { classPropertyName: "itemsOffset", publicName: "itemsOffset", 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 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"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom });
264
316
  }
265
317
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgVirtualListComponent, decorators: [{
266
318
  type: Component,
267
- 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"] }]
319
+ args: [{ selector: 'ng-virtual-list', imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, 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"] }]
268
320
  }], ctorParameters: () => [], propDecorators: { _listContainerRef: [{
269
321
  type: ViewChild,
270
322
  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/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 { ChangeDetectionStrategy, Component, ElementRef, inject, 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 host: {\r\n 'class': 'ngvl__item',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\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 private _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n constructor() {\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 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 showIfNeed() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === 'visible') {\r\n return;\r\n }\r\n\r\n styles.visibility = 'visible';\r\n }\r\n\r\n hide() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === 'hidden') {\r\n return;\r\n }\r\n\r\n styles.visibility = 'hidden';\r\n }\r\n}\r\n","@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem 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 = 2;\r\n\r\nexport const DEFAULT_LIST_SIZE = 400;\r\n\r\nexport const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;\r\n","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, distinctUntilChanged, 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, DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR } 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 itemsOffset = input<number>(DEFAULT_ITEMS_OFFSET);\r\n\r\n private _isVertical = this.getIsVertical();\r\n\r\n protected _displayItems = signal<IRenderVirtualListCollection | null>(null);\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> = [];\r\n\r\n protected _bounds = signal<DOMRect | null>(null);\r\n\r\n protected _scrollSize = signal<number>(0);\r\n\r\n private _resizeObserver: ResizeObserver | null = null;\r\n\r\n private _onResizeHandler = () => {\r\n this._bounds.set(this._container()?.nativeElement?.getBoundingClientRect() ?? null);\r\n }\r\n\r\n private _onScrollHandler = (e: Event) => {\r\n const target = e.target as HTMLDivElement;\r\n 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(v)),\r\n tap(v => {\r\n this._isVertical = v;\r\n const el: HTMLElement = this._elementRef.nativeElement;\r\n toggleClassName(el, v ? 'vertical' : 'horizontal', true);\r\n }),\r\n );\r\n\r\n combineLatest([$bounds, $items, $stickyMap, $scrollSize, $itemSize, $itemsOffset, $snap, $isVertical]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\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, snippedPos = Math.floor(scrollSize);\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 : snippedPos,\r\n y: isVertical ? snippedPos : 0,\r\n width: w,\r\n height: h,\r\n }, config = {\r\n isVertical,\r\n sticky,\r\n snap,\r\n };\r\n\r\n const itemData: IVirtualListItem = 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 ? snippedPos : pos,\r\n y: isVertical ? snaped ? snippedPos : 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];\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 ).subscribe();\r\n\r\n toObservable(this._displayItems).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\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(d?: Direction) {\r\n const dir = d || this.direction();\r\n return isDirection(dir, Directions.VERTICAL);\r\n }\r\n\r\n private createDisplayComponentsIfNeed(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems || !this._listContainerRef) {\r\n return;\r\n }\r\n const _listContainerRef = this._listContainerRef;\r\n\r\n while (this._displayComponents.length < displayItems.length) {\r\n if (_listContainerRef) {\r\n const comp = _listContainerRef.createComponent(NgVirtualListItemComponent);\r\n this._displayComponents.push(comp);\r\n }\r\n }\r\n\r\n const maxLength = displayItems.length + DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR + this.itemsOffset();\r\n if (this._displayComponents.length > maxLength) {\r\n while (this._displayComponents.length > maxLength) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n for (let i = displayItems.length, l = this._displayComponents.length; i < l; i++) {\r\n const comp = this._displayComponents[i];\r\n comp.instance.hide();\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 el.instance.showIfNeed();\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 if (this._displayComponents) {\r\n while (this._displayComponents.length > 0) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n }\r\n }\r\n}\r\n","<div #container 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 { ChangeDetectionStrategy, Component, ElementRef, inject, 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 host: {\r\n 'class': 'ngvl__item',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\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 private _elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n constructor() {\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 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 showIfNeed() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === 'visible') {\r\n return;\r\n }\r\n\r\n styles.visibility = 'visible';\r\n }\r\n\r\n hide() {\r\n const styles = this._elementRef.nativeElement.style;\r\n if (styles.visibility === 'hidden') {\r\n return;\r\n }\r\n\r\n styles.visibility = 'hidden';\r\n }\r\n}\r\n","@let item = data();\r\n@let renderer = itemRenderer();\r\n\r\n@if (item) {\r\n<li #listItem part=\"item\" class=\"ngvl-item__container\">\r\n @if (renderer) {\r\n <ng-container [ngTemplateOutlet]=\"renderer\" [ngTemplateOutletContext]=\"{data: item.data || {}}\" />\r\n }\r\n</li>\r\n}","export const DEFAULT_ITEM_HEIGHT = 24;\r\n\r\nexport const DEFAULT_ITEMS_OFFSET = 2;\r\n\r\nexport const DEFAULT_LIST_SIZE = 400;\r\n\r\nexport const DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR = 1;\r\n","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, distinctUntilChanged, 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, DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR } from './const';\r\nimport { IVirtualListCollection, IVirtualListItem, IVirtualListStickyMap } from './models';\r\nimport { Id, /*IRect*/ } from './types';\r\nimport { IRenderVirtualListCollection } from './models/render-collection.model';\r\nimport { IRenderVirtualListItem } from './models/render-item.model';\r\nimport { Direction, Directions } from './enums';\r\nimport { 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 private static __nextId: number = 0;\r\n\r\n private _id: number = NgVirtualListComponent.__nextId;\r\n /**\r\n * Readonly. Returns the unique identifier of the component.\r\n */\r\n get id() { return this._id; }\r\n\r\n @ViewChild('renderersContainer', { read: ViewContainerRef })\r\n protected _listContainerRef: ViewContainerRef | undefined;\r\n\r\n protected _container = viewChild<ElementRef<HTMLDivElement>>('container');\r\n\r\n protected _list = viewChild<ElementRef<HTMLUListElement>>('list');\r\n\r\n /**\r\n * Fires when the list has been scrolled.\r\n */\r\n onScroll = output<Event | undefined>();\r\n\r\n /**\r\n * Fires when the list has completed scrolling.\r\n */\r\n onScrollEnd = output<Event | undefined>();\r\n\r\n /**\r\n * Collection of list items.\r\n */\r\n items = input.required<IVirtualListCollection>();\r\n\r\n /**\r\n * Determines whether elements will snap. Default value is \"true\".\r\n */\r\n snap = input<boolean>(true);\r\n\r\n /**\r\n * Rendering element template.\r\n */\r\n itemRenderer = input.required<TemplateRef<any>>();\r\n\r\n /**\r\n * Dictionary zIndex by id of the list element. If the value is not set or equal to 0,\r\n * then a simple element is displayed, if the value is greater than 0, then the sticky position mode is enabled for the element.\r\n */\r\n stickyMap = input<IVirtualListStickyMap>({});\r\n\r\n /**\r\n * If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element.\r\n */\r\n itemSize = input(DEFAULT_ITEM_HEIGHT);\r\n\r\n /**\r\n * Determines the direction in which elements are placed. Default value is \"vertical\".\r\n */\r\n direction = input<Direction>(Directions.VERTICAL);\r\n\r\n /**\r\n * Number of elements outside the scope of visibility. Default value is 2.\r\n */\r\n itemsOffset = input<number>(DEFAULT_ITEMS_OFFSET);\r\n\r\n private _isVertical = this.getIsVertical();\r\n\r\n protected _displayItems = signal<IRenderVirtualListCollection | null>(null);\r\n\r\n protected _displayComponents: Array<ComponentRef<NgVirtualListItemComponent>> = [];\r\n\r\n protected _bounds = signal<DOMRect | null>(null);\r\n\r\n protected _scrollSize = signal<number>(0);\r\n\r\n private _resizeObserver: ResizeObserver | null = null;\r\n\r\n private _onResizeHandler = () => {\r\n this._bounds.set(this._container()?.nativeElement?.getBoundingClientRect() ?? null);\r\n }\r\n\r\n private _onScrollHandler = (e: Event) => {\r\n const target = e.target as HTMLDivElement;\r\n 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 NgVirtualListComponent.__nextId = NgVirtualListComponent.__nextId + 1 === Number.MAX_SAFE_INTEGER\r\n ? 0 : NgVirtualListComponent.__nextId + 1;\r\n this._id = NgVirtualListComponent.__nextId;\r\n\r\n 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(v)),\r\n tap(v => {\r\n this._isVertical = v;\r\n const el: HTMLElement = this._elementRef.nativeElement;\r\n toggleClassName(el, v ? 'vertical' : 'horizontal', true);\r\n }),\r\n );\r\n\r\n combineLatest([$bounds, $items, $stickyMap, $scrollSize, $itemSize, $itemsOffset, $snap, $isVertical]).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\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, snippedPos = Math.floor(scrollSize);\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 : snippedPos,\r\n y: isVertical ? snippedPos : 0,\r\n width: w,\r\n height: h,\r\n }, config = {\r\n isVertical,\r\n sticky,\r\n snap,\r\n };\r\n\r\n const itemData: IVirtualListItem = 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 ? snippedPos : pos,\r\n y: isVertical ? snaped ? snippedPos : 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];\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 ).subscribe();\r\n\r\n toObservable(this._displayItems).pipe(\r\n takeUntilDestroyed(),\r\n distinctUntilChanged(),\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(d?: Direction) {\r\n const dir = d || this.direction();\r\n return isDirection(dir, Directions.VERTICAL);\r\n }\r\n\r\n private createDisplayComponentsIfNeed(displayItems: IRenderVirtualListCollection | null) {\r\n if (!displayItems || !this._listContainerRef) {\r\n return;\r\n }\r\n const _listContainerRef = this._listContainerRef;\r\n\r\n while (this._displayComponents.length < displayItems.length) {\r\n if (_listContainerRef) {\r\n const comp = _listContainerRef.createComponent(NgVirtualListItemComponent);\r\n this._displayComponents.push(comp);\r\n }\r\n }\r\n\r\n const maxLength = displayItems.length + DISPLAY_OBJECTS_LENGTH_MESUREMENT_ERROR + this.itemsOffset();\r\n if (this._displayComponents.length > maxLength) {\r\n while (this._displayComponents.length > maxLength) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n for (let i = displayItems.length, l = this._displayComponents.length; i < l; i++) {\r\n const comp = this._displayComponents[i];\r\n comp.instance.hide();\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 el.instance.showIfNeed();\r\n }\r\n }\r\n\r\n /**\r\n * The method scrolls the list to the element with the given id and returns the value of the scrolled area.\r\n * Behavior accepts the values ​​\"auto\", \"instant\" and \"smooth\".\r\n */\r\n scrollTo(id: Id, behavior: ScrollBehavior = 'auto') {\r\n const items = this.items();\r\n if (!items || !items.length) {\r\n return;\r\n }\r\n\r\n const index = items.findIndex(item => item.id === id), scrollSize = index * this.itemSize(), container = this._container();\r\n if (container) {\r\n const params: ScrollToOptions = { [this._isVertical ? 'top' : 'left']: scrollSize, behavior };\r\n container.nativeElement.scroll(params);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n containerEl.nativeElement.addEventListener('scroll', this._onScrollHandler);\r\n containerEl.nativeElement.addEventListener('scrollend', this._onScrollEndHandler);\r\n\r\n this._resizeObserver = new ResizeObserver(this._onResizeHandler);\r\n this._resizeObserver.observe(containerEl.nativeElement);\r\n\r\n this._onResizeHandler();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n const containerEl = this._container();\r\n if (containerEl) {\r\n containerEl.nativeElement.removeEventListener('scroll', this._onScrollHandler);\r\n containerEl.nativeElement.removeEventListener('scrollend', this._onScrollEndHandler);\r\n\r\n if (this._resizeObserver) {\r\n this._resizeObserver.unobserve(containerEl.nativeElement);\r\n }\r\n }\r\n\r\n if (this._displayComponents) {\r\n while (this._displayComponents.length > 0) {\r\n const comp = this._displayComponents.pop();\r\n comp?.destroy();\r\n }\r\n }\r\n }\r\n}\r\n","<div #container part=\"scroller\" class=\"ngvl__container\">\r\n <ul #list part=\"list\" class=\"ngvl__list\">\r\n <ng-container #renderersContainer></ng-container>\r\n </ul>\r\n</div>","/*\r\n * Public API Surface of ng-virtual-list\r\n */\r\n\r\nexport * from './lib/ng-virtual-list.component';\r\nexport * from './lib/models';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,21 +1,56 @@
1
1
  import { AfterViewInit, ComponentRef, ElementRef, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';
2
2
  import { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';
3
3
  import { IVirtualListCollection, IVirtualListStickyMap } from './models';
4
+ import { Id } from './types';
4
5
  import { IRenderVirtualListCollection } from './models/render-collection.model';
5
6
  import { Direction } from './enums';
6
7
  import * as i0 from "@angular/core";
7
8
  export declare class NgVirtualListComponent implements AfterViewInit, OnDestroy {
9
+ private static __nextId;
10
+ private _id;
11
+ /**
12
+ * Readonly. Returns the unique identifier of the component.
13
+ */
14
+ get id(): number;
8
15
  protected _listContainerRef: ViewContainerRef | undefined;
9
16
  protected _container: import("@angular/core").Signal<ElementRef<HTMLDivElement> | undefined>;
10
17
  protected _list: import("@angular/core").Signal<ElementRef<HTMLUListElement> | undefined>;
11
- onScroll: import("@angular/core").OutputEmitterRef<Event>;
12
- onScrollEnd: import("@angular/core").OutputEmitterRef<Event>;
18
+ /**
19
+ * Fires when the list has been scrolled.
20
+ */
21
+ onScroll: import("@angular/core").OutputEmitterRef<Event | undefined>;
22
+ /**
23
+ * Fires when the list has completed scrolling.
24
+ */
25
+ onScrollEnd: import("@angular/core").OutputEmitterRef<Event | undefined>;
26
+ /**
27
+ * Collection of list items.
28
+ */
13
29
  items: import("@angular/core").InputSignal<IVirtualListCollection>;
30
+ /**
31
+ * Determines whether elements will snap. Default value is "true".
32
+ */
14
33
  snap: import("@angular/core").InputSignal<boolean>;
34
+ /**
35
+ * Rendering element template.
36
+ */
15
37
  itemRenderer: import("@angular/core").InputSignal<TemplateRef<any>>;
38
+ /**
39
+ * Dictionary zIndex by id of the list element. If the value is not set or equal to 0,
40
+ * then a simple element is displayed, if the value is greater than 0, then the sticky position mode is enabled for the element.
41
+ */
16
42
  stickyMap: import("@angular/core").InputSignal<IVirtualListStickyMap>;
43
+ /**
44
+ * If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element.
45
+ */
17
46
  itemSize: import("@angular/core").InputSignal<number>;
47
+ /**
48
+ * Determines the direction in which elements are placed. Default value is "vertical".
49
+ */
18
50
  direction: import("@angular/core").InputSignal<Direction>;
51
+ /**
52
+ * Number of elements outside the scope of visibility. Default value is 2.
53
+ */
19
54
  itemsOffset: import("@angular/core").InputSignal<number>;
20
55
  private _isVertical;
21
56
  protected _displayItems: import("@angular/core").WritableSignal<IRenderVirtualListCollection | null>;
@@ -31,6 +66,11 @@ export declare class NgVirtualListComponent implements AfterViewInit, OnDestroy
31
66
  private getIsVertical;
32
67
  private createDisplayComponentsIfNeed;
33
68
  protected refresh(displayItems: IRenderVirtualListCollection | null): void;
69
+ /**
70
+ * The method scrolls the list to the element with the given id and returns the value of the scrolled area.
71
+ * Behavior accepts the values ​​"auto", "instant" and "smooth".
72
+ */
73
+ scrollTo(id: Id, behavior?: ScrollBehavior): void;
34
74
  ngAfterViewInit(): void;
35
75
  ngOnDestroy(): void;
36
76
  static ɵfac: i0.ɵɵFactoryDeclaration<NgVirtualListComponent, never>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-virtual-list",
3
- "version": "0.3.6",
3
+ "version": "0.4.0",
4
4
  "author": {
5
5
  "name": "Evgenii Grebennikov",
6
6
  "email": "djonnyx@gmail.com"