ng-mat-select-infinite-scroll 3.0.1 → 5.0.0-beta.1

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 Haidar Zeineddine
3
+ Copyright (c) 2024 Haidar Zeineddine
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,34 +1,37 @@
1
1
 
2
2
  # Angular Material Select Infinite Scroll
3
-
4
- Adds missing infinite scroll functionality for the [angular material select component](https://material.angular.io/components/select)
5
-
6
-
3
+
4
+ Adds missing infinite scroll functionality for the [Angular Material Select component](https://material.angular.io/components/select).
5
+
7
6
  ### Inputs
8
-
9
- | Property | Description | Type | Default |
10
- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------| ---------- |
11
- | `complete` | If `true`, the `infiniteScroll` output will no longer be triggered | `boolean` | `false` |
12
- | `threshold` | The threshold distance from the bottom of the options list to call the `infiniteScroll` output event when scrolled. The threshold value can be either in percent, or in pixels. For example, use the value of `10%` for the `infiniteScroll` output event to get called when the user has needs 10% to reach the bottom. | `string` | `'15%'` |
13
- | `debounceTime` | The threshold time before firing the `infiniteScroll` event | `number` | `150` |
14
- ### Outputs
15
- | Property | Description | Type |
16
- | ----------------- | --------------------------------------------------------------------------------------- | --------------------
17
- | `infiniteScroll` | Emitted when the scroller inside the `mat-select` reaches the required distance | `EventEmitter<void>`
18
-
19
- ### Installation
20
7
 
21
- ```
8
+ | Property | Description | Type | Default |
9
+ | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------| ---------- |
10
+ | `complete` | If `true`, the `infiniteScroll` output will no longer be triggered. | `boolean` | `false` |
11
+ | `threshold` | The threshold distance from the bottom of the options list to call the `infiniteScroll` output event when scrolled. The threshold value can be either in percent or pixels. For example, `10%` triggers the event 10% before the bottom. | `string` | `'15%'` |
12
+ | `debounceTime` | The threshold time (in milliseconds) before firing the `infiniteScroll` event. | `number` | `150` |
13
+
14
+ ### Outputs
15
+
16
+ | Property | Description | Type |
17
+ | ----------------- | --------------------------------------------------------------------------------------- | --------------------- |
18
+ | `infiniteScroll` | Emitted when the scroller inside the `mat-select` reaches the required distance. | `EventEmitter<void>` |
19
+
20
+ ### Installation
21
+
22
+ ```bash
22
23
  npm i ng-mat-select-infinite-scroll
23
24
  ```
24
25
 
25
- ### Usage
26
- [StackBlitz working example](https://stackblitz.com/edit/ng-mat-select-infinite-scroll)
26
+ ### Usage
27
+
28
+ [StackBlitz working example](https://stackblitz.com/edit/ng-mat-select-infinite-scroll)
27
29
 
28
- Import `MatSelectInfiniteScrollModule` inside the app.module.ts
30
+ Import `MatSelectInfiniteScrollModule` inside the `app.module.ts`:
29
31
  ```typescript
30
- import { MatFormFieldModule, MatSelectModule } from '@angular/material/select';
31
- import {MatSelectInfiniteScrollModule} from 'ng-mat-select-infinite-scroll';
32
+ import { MatFormFieldModule } from '@angular/material/form-field';
33
+ import { MatSelectModule } from '@angular/material/select';
34
+ import { MatSelectInfiniteScrollModule } from 'ng-mat-select-infinite-scroll';
32
35
 
33
36
  @NgModule({
34
37
  declarations: [
@@ -44,11 +47,10 @@ import {MatSelectInfiniteScrollModule} from 'ng-mat-select-infinite-scroll';
44
47
  providers: [],
45
48
  bootstrap: [AppComponent]
46
49
  })
47
- export class AppModule {
48
- }
50
+ export class AppModule {}
49
51
  ```
50
52
 
51
- Then place the msInfiniteScroll directive on the `mat-select` component
53
+ Then, place the `msInfiniteScroll` directive on the `mat-select` component:
52
54
  ```html
53
55
  <mat-form-field appearance="outline">
54
56
  <mat-label>Select</mat-label>
@@ -58,24 +60,34 @@ Then place the msInfiniteScroll directive on the `mat-select` component
58
60
  </mat-form-field>
59
61
  ```
60
62
 
61
- ### Compatibility
63
+ > **Note:**
64
+ > Update the `complete` property when the loaded data reaches the total available data to avoid unnecessary scroll triggers.
65
+ > For older versions of Angular (<15), use version 4 of this library.
66
+
67
+ ### Compatibility
68
+
69
+ This library supports Angular 15 and higher.
70
+ * `@angular/core`: `>=15.0.0 <16`
71
+ * `@angular/cdk`: `>=15.0.0 <16`
72
+ * `@angular/material`: `>=15.0.0 <16`
73
+ * `rxjs`: `^7.0.0`
74
+
75
+ ### Contributions
76
+
77
+ Contributions are welcome! Feel free to open a Pull Request or create a new issue.
62
78
 
63
- * `@angular/core`: `>=6.0.0 <14`,
64
- * `@angular/cdk`: `>=6.0.0 <14`,
65
- * `@angular/material`: `>=6.0.0 <14`,
66
- * `rxjs`: `^6.0.0`
79
+ ### Development Server
67
80
 
68
- ### Contributions
69
- Contributions are welcomed, feel free to open a Pull-Request or open a new issue.
81
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any source files.
70
82
 
71
- ### Development server
83
+ ### Build
72
84
 
73
- Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
85
+ Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
74
86
 
75
- ### Build
87
+ ### Running Unit Tests
76
88
 
77
- Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
89
+ Run `ng test` to execute unit tests via [Karma](https://karma-runner.github.io).
78
90
 
79
- ### Running unit tests
91
+ ### License
80
92
 
81
- Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
93
+ [MIT](LICENSE)
@@ -0,0 +1,64 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { fromEvent, Subject } from 'rxjs';
3
+ import { debounceTime, takeUntil, tap } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ export class InfiniteScrollService {
6
+ constructor(ngZone) {
7
+ this.ngZone = ngZone;
8
+ this.threshold = '15%';
9
+ this.debounceTime = 150;
10
+ this.thrPx = 0;
11
+ this.thrPc = 0;
12
+ this.destroyed$ = new Subject();
13
+ }
14
+ initialize(panel, selectItemHeightPx, config) {
15
+ this.threshold = config.threshold;
16
+ this.debounceTime = config.debounceTime;
17
+ this.complete = config.complete;
18
+ this.panel = panel;
19
+ this.selectItemHeightPx = selectItemHeightPx;
20
+ this.evaluateThreshold();
21
+ }
22
+ evaluateThreshold() {
23
+ if (this.threshold.lastIndexOf('%') > -1) {
24
+ this.thrPx = 0;
25
+ this.thrPc = (parseFloat(this.threshold) / 100);
26
+ }
27
+ else {
28
+ this.thrPx = parseFloat(this.threshold);
29
+ this.thrPc = 0;
30
+ }
31
+ }
32
+ registerScrollListener(infiniteScrollCallback) {
33
+ fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
34
+ this.handleScrollEvent(event, infiniteScrollCallback);
35
+ })).subscribe();
36
+ }
37
+ handleScrollEvent(event, infiniteScrollCallback) {
38
+ this.ngZone.runOutsideAngular(() => {
39
+ if (this.complete) {
40
+ return;
41
+ }
42
+ const countOfRenderedOptions = Math.round(this.panel.scrollHeight / this.selectItemHeightPx);
43
+ const infiniteScrollDistance = this.selectItemHeightPx * countOfRenderedOptions;
44
+ const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
45
+ const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
46
+ if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
47
+ this.ngZone.run(infiniteScrollCallback);
48
+ }
49
+ });
50
+ }
51
+ destroy() {
52
+ this.destroyed$.next();
53
+ this.destroyed$.complete();
54
+ }
55
+ }
56
+ InfiniteScrollService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
57
+ InfiniteScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, providedIn: 'root' });
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, decorators: [{
59
+ type: Injectable,
60
+ args: [{
61
+ providedIn: 'root'
62
+ }]
63
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5maW5pdGUtc2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC9zcmMvbGliL2luZmluaXRlLXNjcm9sbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7O0FBSzVELE1BQU0sT0FBTyxxQkFBcUI7SUFXOUIsWUFBb0IsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFUMUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFHLEdBQUcsQ0FBQztRQUVuQixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBS3pDLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYyxFQUFFLGtCQUEwQixFQUFFLE1BSXREO1FBQ0csSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDbkQ7YUFBTTtZQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNsQjtJQUNMLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxzQkFBa0M7UUFDckQsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUNoQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUMvQixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FDTCxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFVLEVBQUUsc0JBQWtDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDZixPQUFPO2FBQ1Y7WUFDRCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDN0YsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsc0JBQXNCLENBQUM7WUFDaEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBRXhGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFFMUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxJQUFJLHNCQUFzQixFQUFFO2dCQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2FBQzNDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDOzttSEFwRVEscUJBQXFCO3VIQUFyQixxQkFBcUIsY0FGbEIsTUFBTTs0RkFFVCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgSW5maW5pdGVTY3JvbGxTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgdGhyZXNob2xkID0gJzE1JSc7XG4gICAgcHJpdmF0ZSBkZWJvdW5jZVRpbWUgPSAxNTA7XG4gICAgcHJpdmF0ZSBjb21wbGV0ZSE6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSB0aHJQeCA9IDA7XG4gICAgcHJpdmF0ZSB0aHJQYyA9IDA7XG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIHNlbGVjdEl0ZW1IZWlnaHRQeCE6IG51bWJlcjtcbiAgICBwcml2YXRlIHBhbmVsITogRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKHBhbmVsOiBFbGVtZW50LCBzZWxlY3RJdGVtSGVpZ2h0UHg6IG51bWJlciwgY29uZmlnOiB7XG4gICAgICAgIHRocmVzaG9sZDogc3RyaW5nLFxuICAgICAgICBkZWJvdW5jZVRpbWU6IG51bWJlcixcbiAgICAgICAgY29tcGxldGU6IGJvb2xlYW5cbiAgICB9KSB7XG4gICAgICAgIHRoaXMudGhyZXNob2xkID0gY29uZmlnLnRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5kZWJvdW5jZVRpbWUgPSBjb25maWcuZGVib3VuY2VUaW1lO1xuICAgICAgICB0aGlzLmNvbXBsZXRlID0gY29uZmlnLmNvbXBsZXRlO1xuXG4gICAgICAgIHRoaXMucGFuZWwgPSBwYW5lbDtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtSGVpZ2h0UHggPSBzZWxlY3RJdGVtSGVpZ2h0UHg7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVUaHJlc2hvbGQoKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVRocmVzaG9sZCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyZXNob2xkLmxhc3RJbmRleE9mKCclJykgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy50aHJQeCA9IDA7XG4gICAgICAgICAgICB0aGlzLnRoclBjID0gKHBhcnNlRmxvYXQodGhpcy50aHJlc2hvbGQpIC8gMTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGhyUHggPSBwYXJzZUZsb2F0KHRoaXMudGhyZXNob2xkKTtcbiAgICAgICAgICAgIHRoaXMudGhyUGMgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcihpbmZpbml0ZVNjcm9sbENhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLnBhbmVsLCAnc2Nyb2xsJykucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpLFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKSxcbiAgICAgICAgICAgIHRhcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbEV2ZW50KGV2ZW50LCBpbmZpbml0ZVNjcm9sbENhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlU2Nyb2xsRXZlbnQoZXZlbnQ6IGFueSwgaW5maW5pdGVTY3JvbGxDYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvdW50T2ZSZW5kZXJlZE9wdGlvbnMgPSBNYXRoLnJvdW5kKHRoaXMucGFuZWwuc2Nyb2xsSGVpZ2h0IC8gdGhpcy5zZWxlY3RJdGVtSGVpZ2h0UHgpO1xuICAgICAgICAgICAgY29uc3QgaW5maW5pdGVTY3JvbGxEaXN0YW5jZSA9IHRoaXMuc2VsZWN0SXRlbUhlaWdodFB4ICogY291bnRPZlJlbmRlcmVkT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMudGhyUGMgIT09IDAgPyAoaW5maW5pdGVTY3JvbGxEaXN0YW5jZSAqIHRoaXMudGhyUGMpIDogdGhpcy50aHJQeDtcblxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZWREaXN0YW5jZSA9IHRoaXMucGFuZWwuY2xpZW50SGVpZ2h0ICsgZXZlbnQudGFyZ2V0LnNjcm9sbFRvcDtcblxuICAgICAgICAgICAgaWYgKChzY3JvbGxlZERpc3RhbmNlICsgdGhyZXNob2xkKSA+PSBpbmZpbml0ZVNjcm9sbERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKGluZmluaXRlU2Nyb2xsQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,59 @@
1
+ import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
+ import { takeUntil } from 'rxjs/operators';
3
+ import { InfiniteScrollService } from "./infinite-scroll.service";
4
+ import { Subject } from "rxjs";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/material/select";
7
+ import * as i2 from "./infinite-scroll.service";
8
+ /** The height of the select items in `em` units. */
9
+ const SELECT_ITEM_HEIGHT_EM = 3;
10
+ export class MatSelectInfiniteScrollDirective {
11
+ constructor(matSelect, infiniteScrollService) {
12
+ this.matSelect = matSelect;
13
+ this.infiniteScrollService = infiniteScrollService;
14
+ this.threshold = '15%';
15
+ this.debounceTime = 150;
16
+ this.infiniteScroll = new EventEmitter();
17
+ this.destroyed$ = new Subject();
18
+ }
19
+ ngAfterViewInit() {
20
+ this.matSelect.openedChange.pipe(takeUntil(this.destroyed$)).subscribe((opened) => {
21
+ if (opened) {
22
+ const panel = this.matSelect.panel.nativeElement;
23
+ const selectItemHeightPx = this.getSelectItemHeightPx(panel);
24
+ this.infiniteScrollService.initialize(panel, selectItemHeightPx, {
25
+ threshold: this.threshold,
26
+ debounceTime: this.debounceTime,
27
+ complete: this.complete
28
+ });
29
+ this.infiniteScrollService.registerScrollListener(() => this.infiniteScroll.emit());
30
+ }
31
+ });
32
+ }
33
+ getSelectItemHeightPx(panel) {
34
+ return parseFloat(getComputedStyle(panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
35
+ }
36
+ ngOnDestroy() {
37
+ this.destroyed$.next(true);
38
+ this.destroyed$.complete();
39
+ this.infiniteScrollService.destroy();
40
+ }
41
+ }
42
+ MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1.MatSelect }, { token: i2.InfiniteScrollService }], target: i0.ɵɵFactoryTarget.Directive });
43
+ MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: MatSelectInfiniteScrollDirective, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete" }, outputs: { infiniteScroll: "infiniteScroll" }, providers: [InfiniteScrollService], ngImport: i0 });
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
45
+ type: Directive,
46
+ args: [{
47
+ selector: '[msInfiniteScroll]',
48
+ providers: [InfiniteScrollService]
49
+ }]
50
+ }], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: i2.InfiniteScrollService }]; }, propDecorators: { threshold: [{
51
+ type: Input
52
+ }], debounceTime: [{
53
+ type: Input
54
+ }], complete: [{
55
+ type: Input
56
+ }], infiniteScroll: [{
57
+ type: Output
58
+ }] } });
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBNkIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9HLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7O0FBRTdCLG9EQUFvRDtBQUNwRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQU1oQyxNQUFNLE9BQU8sZ0NBQWdDO0lBU3pDLFlBQXNCLFNBQW9CLEVBQVUscUJBQTRDO1FBQTFFLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBVSwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBUHZGLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFFbEIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTVDLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBRzVDLENBQUM7SUFHRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUM3QixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ25CLElBQUksTUFBTSxFQUFFO2dCQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDakQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFO29CQUM3RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2lCQUMxQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUN2RjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQWM7UUFDaEMsT0FBTyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcscUJBQXFCLENBQUM7SUFDaEYsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6QyxDQUFDOzs4SEF4Q1EsZ0NBQWdDO2tIQUFoQyxnQ0FBZ0Msb0xBRjlCLENBQUMscUJBQXFCLENBQUM7NEZBRXpCLGdDQUFnQztrQkFKNUMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDckM7b0lBR1ksU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRTZWxlY3R9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtJbmZpbml0ZVNjcm9sbFNlcnZpY2V9IGZyb20gXCIuL2luZmluaXRlLXNjcm9sbC5zZXJ2aWNlXCI7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XG5cbi8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QgaXRlbXMgaW4gYGVtYCB1bml0cy4gKi9cbmNvbnN0IFNFTEVDVF9JVEVNX0hFSUdIVF9FTSA9IDM7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21zSW5maW5pdGVTY3JvbGxdJyxcbiAgICBwcm92aWRlcnM6IFtJbmZpbml0ZVNjcm9sbFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAgIEBJbnB1dCgpIHRocmVzaG9sZCA9ICcxNSUnO1xuICAgIEBJbnB1dCgpIGRlYm91bmNlVGltZSA9IDE1MDtcbiAgICBASW5wdXQoKSBjb21wbGV0ZSE6IGJvb2xlYW47XG4gICAgQE91dHB1dCgpIGluZmluaXRlU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBtYXRTZWxlY3Q6IE1hdFNlbGVjdCwgcHJpdmF0ZSBpbmZpbml0ZVNjcm9sbFNlcnZpY2U6IEluZmluaXRlU2Nyb2xsU2VydmljZSkge1xuICAgIH1cblxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm1hdFNlbGVjdC5vcGVuZWRDaGFuZ2UucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpXG4gICAgICAgICkuc3Vic2NyaWJlKChvcGVuZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChvcGVuZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMubWF0U2VsZWN0LnBhbmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0SXRlbUhlaWdodFB4ID0gdGhpcy5nZXRTZWxlY3RJdGVtSGVpZ2h0UHgocGFuZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxTZXJ2aWNlLmluaXRpYWxpemUocGFuZWwsIHNlbGVjdEl0ZW1IZWlnaHRQeCwge1xuICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWU6IHRoaXMuZGVib3VuY2VUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogdGhpcy5jb21wbGV0ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbFNlcnZpY2UucmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcigoKSA9PiB0aGlzLmluZmluaXRlU2Nyb2xsLmVtaXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFNlbGVjdEl0ZW1IZWlnaHRQeChwYW5lbDogRWxlbWVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUocGFuZWwpLmZvbnRTaXplKSAqIFNFTEVDVF9JVEVNX0hFSUdIVF9FTTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuXG4gICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxTZXJ2aWNlLmRlc3Ryb3koKTtcbiAgICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,20 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { MatSelectInfiniteScrollDirective } from './mat-select-infinite-scroll.directive';
3
+ import { MatSelectModule } from '@angular/material/select';
4
+ import * as i0 from "@angular/core";
5
+ export class MatSelectInfiniteScrollModule {
6
+ }
7
+ MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
+ MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, declarations: [MatSelectInfiniteScrollDirective], imports: [MatSelectModule], exports: [MatSelectInfiniteScrollDirective] });
9
+ MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, imports: [MatSelectModule] });
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, decorators: [{
11
+ type: NgModule,
12
+ args: [{
13
+ declarations: [MatSelectInfiniteScrollDirective],
14
+ imports: [
15
+ MatSelectModule,
16
+ ],
17
+ exports: [MatSelectInfiniteScrollDirective]
18
+ }]
19
+ }] });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsZ0NBQWdDLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBU3pELE1BQU0sT0FBTyw2QkFBNkI7OzJIQUE3Qiw2QkFBNkI7NEhBQTdCLDZCQUE2QixpQkFOdkIsZ0NBQWdDLGFBRTNDLGVBQWUsYUFFVCxnQ0FBZ0M7NEhBRWpDLDZCQUE2QixZQUpsQyxlQUFlOzRGQUlWLDZCQUE2QjtrQkFQekMsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQztvQkFDaEQsT0FBTyxFQUFFO3dCQUNMLGVBQWU7cUJBQ2xCO29CQUNELE9BQU8sRUFBRSxDQUFDLGdDQUFnQyxDQUFDO2lCQUM5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZX0gZnJvbSAnLi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtNYXRTZWxlY3RNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbTWF0U2VsZWN0SW5maW5pdGVTY3JvbGxEaXJlY3RpdmVdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIF0sXG4gICAgZXhwb3J0czogW01hdFNlbGVjdEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbE1vZHVsZSB7XG59XG4iXX0=
@@ -0,0 +1,145 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, EventEmitter, Directive, Input, Output, NgModule } from '@angular/core';
3
+ import { takeUntil, debounceTime, tap } from 'rxjs/operators';
4
+ import { Subject, fromEvent } from 'rxjs';
5
+ import * as i1 from '@angular/material/select';
6
+ import { MatSelectModule } from '@angular/material/select';
7
+
8
+ class InfiniteScrollService {
9
+ constructor(ngZone) {
10
+ this.ngZone = ngZone;
11
+ this.threshold = '15%';
12
+ this.debounceTime = 150;
13
+ this.thrPx = 0;
14
+ this.thrPc = 0;
15
+ this.destroyed$ = new Subject();
16
+ }
17
+ initialize(panel, selectItemHeightPx, config) {
18
+ this.threshold = config.threshold;
19
+ this.debounceTime = config.debounceTime;
20
+ this.complete = config.complete;
21
+ this.panel = panel;
22
+ this.selectItemHeightPx = selectItemHeightPx;
23
+ this.evaluateThreshold();
24
+ }
25
+ evaluateThreshold() {
26
+ if (this.threshold.lastIndexOf('%') > -1) {
27
+ this.thrPx = 0;
28
+ this.thrPc = (parseFloat(this.threshold) / 100);
29
+ }
30
+ else {
31
+ this.thrPx = parseFloat(this.threshold);
32
+ this.thrPc = 0;
33
+ }
34
+ }
35
+ registerScrollListener(infiniteScrollCallback) {
36
+ fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
37
+ this.handleScrollEvent(event, infiniteScrollCallback);
38
+ })).subscribe();
39
+ }
40
+ handleScrollEvent(event, infiniteScrollCallback) {
41
+ this.ngZone.runOutsideAngular(() => {
42
+ if (this.complete) {
43
+ return;
44
+ }
45
+ const countOfRenderedOptions = Math.round(this.panel.scrollHeight / this.selectItemHeightPx);
46
+ const infiniteScrollDistance = this.selectItemHeightPx * countOfRenderedOptions;
47
+ const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
48
+ const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
49
+ if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
50
+ this.ngZone.run(infiniteScrollCallback);
51
+ }
52
+ });
53
+ }
54
+ destroy() {
55
+ this.destroyed$.next();
56
+ this.destroyed$.complete();
57
+ }
58
+ }
59
+ InfiniteScrollService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
60
+ InfiniteScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, providedIn: 'root' });
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, decorators: [{
62
+ type: Injectable,
63
+ args: [{
64
+ providedIn: 'root'
65
+ }]
66
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
67
+
68
+ /** The height of the select items in `em` units. */
69
+ const SELECT_ITEM_HEIGHT_EM = 3;
70
+ class MatSelectInfiniteScrollDirective {
71
+ constructor(matSelect, infiniteScrollService) {
72
+ this.matSelect = matSelect;
73
+ this.infiniteScrollService = infiniteScrollService;
74
+ this.threshold = '15%';
75
+ this.debounceTime = 150;
76
+ this.infiniteScroll = new EventEmitter();
77
+ this.destroyed$ = new Subject();
78
+ }
79
+ ngAfterViewInit() {
80
+ this.matSelect.openedChange.pipe(takeUntil(this.destroyed$)).subscribe((opened) => {
81
+ if (opened) {
82
+ const panel = this.matSelect.panel.nativeElement;
83
+ const selectItemHeightPx = this.getSelectItemHeightPx(panel);
84
+ this.infiniteScrollService.initialize(panel, selectItemHeightPx, {
85
+ threshold: this.threshold,
86
+ debounceTime: this.debounceTime,
87
+ complete: this.complete
88
+ });
89
+ this.infiniteScrollService.registerScrollListener(() => this.infiniteScroll.emit());
90
+ }
91
+ });
92
+ }
93
+ getSelectItemHeightPx(panel) {
94
+ return parseFloat(getComputedStyle(panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
95
+ }
96
+ ngOnDestroy() {
97
+ this.destroyed$.next(true);
98
+ this.destroyed$.complete();
99
+ this.infiniteScrollService.destroy();
100
+ }
101
+ }
102
+ MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1.MatSelect }, { token: InfiniteScrollService }], target: i0.ɵɵFactoryTarget.Directive });
103
+ MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: MatSelectInfiniteScrollDirective, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete" }, outputs: { infiniteScroll: "infiniteScroll" }, providers: [InfiniteScrollService], ngImport: i0 });
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
105
+ type: Directive,
106
+ args: [{
107
+ selector: '[msInfiniteScroll]',
108
+ providers: [InfiniteScrollService]
109
+ }]
110
+ }], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: InfiniteScrollService }]; }, propDecorators: { threshold: [{
111
+ type: Input
112
+ }], debounceTime: [{
113
+ type: Input
114
+ }], complete: [{
115
+ type: Input
116
+ }], infiniteScroll: [{
117
+ type: Output
118
+ }] } });
119
+
120
+ class MatSelectInfiniteScrollModule {
121
+ }
122
+ MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
123
+ MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, declarations: [MatSelectInfiniteScrollDirective], imports: [MatSelectModule], exports: [MatSelectInfiniteScrollDirective] });
124
+ MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, imports: [MatSelectModule] });
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, decorators: [{
126
+ type: NgModule,
127
+ args: [{
128
+ declarations: [MatSelectInfiniteScrollDirective],
129
+ imports: [
130
+ MatSelectModule,
131
+ ],
132
+ exports: [MatSelectInfiniteScrollDirective]
133
+ }]
134
+ }] });
135
+
136
+ /*
137
+ * Public API Surface of ng-mat-select-infinite-scroll
138
+ */
139
+
140
+ /**
141
+ * Generated bundle index. Do not edit.
142
+ */
143
+
144
+ export { MatSelectInfiniteScrollDirective, MatSelectInfiniteScrollModule };
145
+ //# sourceMappingURL=ng-mat-select-infinite-scroll.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-mat-select-infinite-scroll.mjs","sources":["../../../projects/ng-mat-select-infinite-scroll/src/lib/infinite-scroll.service.ts","../../../projects/ng-mat-select-infinite-scroll/src/lib/mat-select-infinite-scroll.directive.ts","../../../projects/ng-mat-select-infinite-scroll/src/lib/mat-select-infinite-scroll.module.ts","../../../projects/ng-mat-select-infinite-scroll/src/public-api.ts","../../../projects/ng-mat-select-infinite-scroll/src/ng-mat-select-infinite-scroll.ts"],"sourcesContent":["import {Injectable, NgZone} from '@angular/core';\nimport {fromEvent, Subject} from 'rxjs';\nimport {debounceTime, takeUntil, tap} from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class InfiniteScrollService {\n\n private threshold = '15%';\n private debounceTime = 150;\n private complete!: boolean;\n private thrPx = 0;\n private thrPc = 0;\n private destroyed$ = new Subject<void>();\n private selectItemHeightPx!: number;\n private panel!: Element;\n\n constructor(private ngZone: NgZone) {\n }\n\n initialize(panel: Element, selectItemHeightPx: number, config: {\n threshold: string,\n debounceTime: number,\n complete: boolean\n }) {\n this.threshold = config.threshold;\n this.debounceTime = config.debounceTime;\n this.complete = config.complete;\n\n this.panel = panel;\n this.selectItemHeightPx = selectItemHeightPx;\n this.evaluateThreshold();\n }\n\n evaluateThreshold() {\n if (this.threshold.lastIndexOf('%') > -1) {\n this.thrPx = 0;\n this.thrPc = (parseFloat(this.threshold) / 100);\n } else {\n this.thrPx = parseFloat(this.threshold);\n this.thrPc = 0;\n }\n }\n\n registerScrollListener(infiniteScrollCallback: () => void) {\n fromEvent(this.panel, 'scroll').pipe(\n takeUntil(this.destroyed$),\n debounceTime(this.debounceTime),\n tap((event) => {\n this.handleScrollEvent(event, infiniteScrollCallback);\n })\n ).subscribe();\n }\n\n handleScrollEvent(event: any, infiniteScrollCallback: () => void) {\n this.ngZone.runOutsideAngular(() => {\n if (this.complete) {\n return;\n }\n const countOfRenderedOptions = Math.round(this.panel.scrollHeight / this.selectItemHeightPx);\n const infiniteScrollDistance = this.selectItemHeightPx * countOfRenderedOptions;\n const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;\n\n const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;\n\n if ((scrolledDistance + threshold) >= infiniteScrollDistance) {\n this.ngZone.run(infiniteScrollCallback);\n }\n });\n }\n\n destroy() {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n}\n","import {AfterViewInit, Directive, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output} from '@angular/core';\nimport {MatSelect} from '@angular/material/select';\nimport {takeUntil} from 'rxjs/operators';\nimport {InfiniteScrollService} from \"./infinite-scroll.service\";\nimport {Subject} from \"rxjs\";\n\n/** The height of the select items in `em` units. */\nconst SELECT_ITEM_HEIGHT_EM = 3;\n\n@Directive({\n selector: '[msInfiniteScroll]',\n providers: [InfiniteScrollService]\n})\nexport class MatSelectInfiniteScrollDirective implements OnDestroy, AfterViewInit {\n\n @Input() threshold = '15%';\n @Input() debounceTime = 150;\n @Input() complete!: boolean;\n @Output() infiniteScroll = new EventEmitter<void>();\n\n private destroyed$ = new Subject<boolean>();\n\n constructor(protected matSelect: MatSelect, private infiniteScrollService: InfiniteScrollService) {\n }\n\n\n ngAfterViewInit() {\n this.matSelect.openedChange.pipe(\n takeUntil(this.destroyed$)\n ).subscribe((opened) => {\n if (opened) {\n const panel = this.matSelect.panel.nativeElement;\n const selectItemHeightPx = this.getSelectItemHeightPx(panel);\n this.infiniteScrollService.initialize(panel, selectItemHeightPx, {\n threshold: this.threshold,\n debounceTime: this.debounceTime,\n complete: this.complete\n });\n\n this.infiniteScrollService.registerScrollListener(() => this.infiniteScroll.emit());\n }\n });\n }\n\n getSelectItemHeightPx(panel: Element): number {\n return parseFloat(getComputedStyle(panel).fontSize) * SELECT_ITEM_HEIGHT_EM;\n }\n\n ngOnDestroy() {\n this.destroyed$.next(true);\n this.destroyed$.complete();\n\n this.infiniteScrollService.destroy();\n }\n\n}\n","import {NgModule} from '@angular/core';\nimport {MatSelectInfiniteScrollDirective} from './mat-select-infinite-scroll.directive';\nimport {MatSelectModule} from '@angular/material/select';\n\n@NgModule({\n declarations: [MatSelectInfiniteScrollDirective],\n imports: [\n MatSelectModule,\n ],\n exports: [MatSelectInfiniteScrollDirective]\n})\nexport class MatSelectInfiniteScrollModule {\n}\n","/*\n * Public API Surface of ng-mat-select-infinite-scroll\n */\n\nexport * from './lib/mat-select-infinite-scroll.directive';\nexport * from './lib/mat-select-infinite-scroll.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.InfiniteScrollService"],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, EventEmitter, Directive, Input, Output, NgModule } from '@angular/core';
3
+ import { takeUntil, debounceTime, tap } from 'rxjs/operators';
4
+ import { Subject, fromEvent } from 'rxjs';
5
+ import * as i1 from '@angular/material/select';
6
+ import { MatSelectModule } from '@angular/material/select';
7
+
8
+ class InfiniteScrollService {
9
+ constructor(ngZone) {
10
+ this.ngZone = ngZone;
11
+ this.threshold = '15%';
12
+ this.debounceTime = 150;
13
+ this.thrPx = 0;
14
+ this.thrPc = 0;
15
+ this.destroyed$ = new Subject();
16
+ }
17
+ initialize(panel, selectItemHeightPx, config) {
18
+ this.threshold = config.threshold;
19
+ this.debounceTime = config.debounceTime;
20
+ this.complete = config.complete;
21
+ this.panel = panel;
22
+ this.selectItemHeightPx = selectItemHeightPx;
23
+ this.evaluateThreshold();
24
+ }
25
+ evaluateThreshold() {
26
+ if (this.threshold.lastIndexOf('%') > -1) {
27
+ this.thrPx = 0;
28
+ this.thrPc = (parseFloat(this.threshold) / 100);
29
+ }
30
+ else {
31
+ this.thrPx = parseFloat(this.threshold);
32
+ this.thrPc = 0;
33
+ }
34
+ }
35
+ registerScrollListener(infiniteScrollCallback) {
36
+ fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
37
+ this.handleScrollEvent(event, infiniteScrollCallback);
38
+ })).subscribe();
39
+ }
40
+ handleScrollEvent(event, infiniteScrollCallback) {
41
+ this.ngZone.runOutsideAngular(() => {
42
+ if (this.complete) {
43
+ return;
44
+ }
45
+ const countOfRenderedOptions = Math.round(this.panel.scrollHeight / this.selectItemHeightPx);
46
+ const infiniteScrollDistance = this.selectItemHeightPx * countOfRenderedOptions;
47
+ const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
48
+ const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
49
+ if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
50
+ this.ngZone.run(infiniteScrollCallback);
51
+ }
52
+ });
53
+ }
54
+ destroy() {
55
+ this.destroyed$.next();
56
+ this.destroyed$.complete();
57
+ }
58
+ }
59
+ InfiniteScrollService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
60
+ InfiniteScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, providedIn: 'root' });
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InfiniteScrollService, decorators: [{
62
+ type: Injectable,
63
+ args: [{
64
+ providedIn: 'root'
65
+ }]
66
+ }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
67
+
68
+ /** The height of the select items in `em` units. */
69
+ const SELECT_ITEM_HEIGHT_EM = 3;
70
+ class MatSelectInfiniteScrollDirective {
71
+ constructor(matSelect, infiniteScrollService) {
72
+ this.matSelect = matSelect;
73
+ this.infiniteScrollService = infiniteScrollService;
74
+ this.threshold = '15%';
75
+ this.debounceTime = 150;
76
+ this.infiniteScroll = new EventEmitter();
77
+ this.destroyed$ = new Subject();
78
+ }
79
+ ngAfterViewInit() {
80
+ this.matSelect.openedChange.pipe(takeUntil(this.destroyed$)).subscribe((opened) => {
81
+ if (opened) {
82
+ const panel = this.matSelect.panel.nativeElement;
83
+ const selectItemHeightPx = this.getSelectItemHeightPx(panel);
84
+ this.infiniteScrollService.initialize(panel, selectItemHeightPx, {
85
+ threshold: this.threshold,
86
+ debounceTime: this.debounceTime,
87
+ complete: this.complete
88
+ });
89
+ this.infiniteScrollService.registerScrollListener(() => this.infiniteScroll.emit());
90
+ }
91
+ });
92
+ }
93
+ getSelectItemHeightPx(panel) {
94
+ return parseFloat(getComputedStyle(panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
95
+ }
96
+ ngOnDestroy() {
97
+ this.destroyed$.next(true);
98
+ this.destroyed$.complete();
99
+ this.infiniteScrollService.destroy();
100
+ }
101
+ }
102
+ MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1.MatSelect }, { token: InfiniteScrollService }], target: i0.ɵɵFactoryTarget.Directive });
103
+ MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: MatSelectInfiniteScrollDirective, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete" }, outputs: { infiniteScroll: "infiniteScroll" }, providers: [InfiniteScrollService], ngImport: i0 });
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
105
+ type: Directive,
106
+ args: [{
107
+ selector: '[msInfiniteScroll]',
108
+ providers: [InfiniteScrollService]
109
+ }]
110
+ }], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: InfiniteScrollService }]; }, propDecorators: { threshold: [{
111
+ type: Input
112
+ }], debounceTime: [{
113
+ type: Input
114
+ }], complete: [{
115
+ type: Input
116
+ }], infiniteScroll: [{
117
+ type: Output
118
+ }] } });
119
+
120
+ class MatSelectInfiniteScrollModule {
121
+ }
122
+ MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
123
+ MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, declarations: [MatSelectInfiniteScrollDirective], imports: [MatSelectModule], exports: [MatSelectInfiniteScrollDirective] });
124
+ MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, imports: [MatSelectModule] });
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollModule, decorators: [{
126
+ type: NgModule,
127
+ args: [{
128
+ declarations: [MatSelectInfiniteScrollDirective],
129
+ imports: [
130
+ MatSelectModule,
131
+ ],
132
+ exports: [MatSelectInfiniteScrollDirective]
133
+ }]
134
+ }] });
135
+
136
+ /*
137
+ * Public API Surface of ng-mat-select-infinite-scroll
138
+ */
139
+
140
+ /**
141
+ * Generated bundle index. Do not edit.
142
+ */
143
+
144
+ export { MatSelectInfiniteScrollDirective, MatSelectInfiniteScrollModule };
145
+ //# sourceMappingURL=ng-mat-select-infinite-scroll.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-mat-select-infinite-scroll.mjs","sources":["../../../projects/ng-mat-select-infinite-scroll/src/lib/infinite-scroll.service.ts","../../../projects/ng-mat-select-infinite-scroll/src/lib/mat-select-infinite-scroll.directive.ts","../../../projects/ng-mat-select-infinite-scroll/src/lib/mat-select-infinite-scroll.module.ts","../../../projects/ng-mat-select-infinite-scroll/src/public-api.ts","../../../projects/ng-mat-select-infinite-scroll/src/ng-mat-select-infinite-scroll.ts"],"sourcesContent":["import {Injectable, NgZone} from '@angular/core';\nimport {fromEvent, Subject} from 'rxjs';\nimport {debounceTime, takeUntil, tap} from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class InfiniteScrollService {\n\n private threshold = '15%';\n private debounceTime = 150;\n private complete!: boolean;\n private thrPx = 0;\n private thrPc = 0;\n private destroyed$ = new Subject<void>();\n private selectItemHeightPx!: number;\n private panel!: Element;\n\n constructor(private ngZone: NgZone) {\n }\n\n initialize(panel: Element, selectItemHeightPx: number, config: {\n threshold: string,\n debounceTime: number,\n complete: boolean\n }) {\n this.threshold = config.threshold;\n this.debounceTime = config.debounceTime;\n this.complete = config.complete;\n\n this.panel = panel;\n this.selectItemHeightPx = selectItemHeightPx;\n this.evaluateThreshold();\n }\n\n evaluateThreshold() {\n if (this.threshold.lastIndexOf('%') > -1) {\n this.thrPx = 0;\n this.thrPc = (parseFloat(this.threshold) / 100);\n } else {\n this.thrPx = parseFloat(this.threshold);\n this.thrPc = 0;\n }\n }\n\n registerScrollListener(infiniteScrollCallback: () => void) {\n fromEvent(this.panel, 'scroll').pipe(\n takeUntil(this.destroyed$),\n debounceTime(this.debounceTime),\n tap((event) => {\n this.handleScrollEvent(event, infiniteScrollCallback);\n })\n ).subscribe();\n }\n\n handleScrollEvent(event: any, infiniteScrollCallback: () => void) {\n this.ngZone.runOutsideAngular(() => {\n if (this.complete) {\n return;\n }\n const countOfRenderedOptions = Math.round(this.panel.scrollHeight / this.selectItemHeightPx);\n const infiniteScrollDistance = this.selectItemHeightPx * countOfRenderedOptions;\n const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;\n\n const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;\n\n if ((scrolledDistance + threshold) >= infiniteScrollDistance) {\n this.ngZone.run(infiniteScrollCallback);\n }\n });\n }\n\n destroy() {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n}\n","import {AfterViewInit, Directive, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output} from '@angular/core';\nimport {MatSelect} from '@angular/material/select';\nimport {takeUntil} from 'rxjs/operators';\nimport {InfiniteScrollService} from \"./infinite-scroll.service\";\nimport {Subject} from \"rxjs\";\n\n/** The height of the select items in `em` units. */\nconst SELECT_ITEM_HEIGHT_EM = 3;\n\n@Directive({\n selector: '[msInfiniteScroll]',\n providers: [InfiniteScrollService]\n})\nexport class MatSelectInfiniteScrollDirective implements OnDestroy, AfterViewInit {\n\n @Input() threshold = '15%';\n @Input() debounceTime = 150;\n @Input() complete!: boolean;\n @Output() infiniteScroll = new EventEmitter<void>();\n\n private destroyed$ = new Subject<boolean>();\n\n constructor(protected matSelect: MatSelect, private infiniteScrollService: InfiniteScrollService) {\n }\n\n\n ngAfterViewInit() {\n this.matSelect.openedChange.pipe(\n takeUntil(this.destroyed$)\n ).subscribe((opened) => {\n if (opened) {\n const panel = this.matSelect.panel.nativeElement;\n const selectItemHeightPx = this.getSelectItemHeightPx(panel);\n this.infiniteScrollService.initialize(panel, selectItemHeightPx, {\n threshold: this.threshold,\n debounceTime: this.debounceTime,\n complete: this.complete\n });\n\n this.infiniteScrollService.registerScrollListener(() => this.infiniteScroll.emit());\n }\n });\n }\n\n getSelectItemHeightPx(panel: Element): number {\n return parseFloat(getComputedStyle(panel).fontSize) * SELECT_ITEM_HEIGHT_EM;\n }\n\n ngOnDestroy() {\n this.destroyed$.next(true);\n this.destroyed$.complete();\n\n this.infiniteScrollService.destroy();\n }\n\n}\n","import {NgModule} from '@angular/core';\nimport {MatSelectInfiniteScrollDirective} from './mat-select-infinite-scroll.directive';\nimport {MatSelectModule} from '@angular/material/select';\n\n@NgModule({\n declarations: [MatSelectInfiniteScrollDirective],\n imports: [\n MatSelectModule,\n ],\n exports: [MatSelectInfiniteScrollDirective]\n})\nexport class MatSelectInfiniteScrollModule {\n}\n","/*\n * Public API Surface of ng-mat-select-infinite-scroll\n */\n\nexport * from './lib/mat-select-infinite-scroll.directive';\nexport * from './lib/mat-select-infinite-scroll.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.InfiniteScrollService"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { NgZone } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class InfiniteScrollService {
4
+ private ngZone;
5
+ private threshold;
6
+ private debounceTime;
7
+ private complete;
8
+ private thrPx;
9
+ private thrPc;
10
+ private destroyed$;
11
+ private selectItemHeightPx;
12
+ private panel;
13
+ constructor(ngZone: NgZone);
14
+ initialize(panel: Element, selectItemHeightPx: number, config: {
15
+ threshold: string;
16
+ debounceTime: number;
17
+ complete: boolean;
18
+ }): void;
19
+ evaluateThreshold(): void;
20
+ registerScrollListener(infiniteScrollCallback: () => void): void;
21
+ handleScrollEvent(event: any, infiniteScrollCallback: () => void): void;
22
+ destroy(): void;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<InfiniteScrollService, never>;
24
+ static ɵprov: i0.ɵɵInjectableDeclaration<InfiniteScrollService>;
25
+ }
@@ -1,26 +1,19 @@
1
- import { AfterViewInit, EventEmitter, NgZone, OnDestroy, OnInit } from '@angular/core';
1
+ import { AfterViewInit, EventEmitter, OnDestroy } from '@angular/core';
2
2
  import { MatSelect } from '@angular/material/select';
3
+ import { InfiniteScrollService } from "./infinite-scroll.service";
3
4
  import * as i0 from "@angular/core";
4
- export declare class MatSelectInfiniteScrollDirective implements OnInit, OnDestroy, AfterViewInit {
5
- private matSelect;
6
- private ngZone;
5
+ export declare class MatSelectInfiniteScrollDirective implements OnDestroy, AfterViewInit {
6
+ protected matSelect: MatSelect;
7
+ private infiniteScrollService;
7
8
  threshold: string;
8
9
  debounceTime: number;
9
10
  complete: boolean;
10
11
  infiniteScroll: EventEmitter<void>;
11
- private panel;
12
- private thrPx;
13
- private thrPc;
14
- private singleOptionHeight;
15
12
  private destroyed$;
16
- constructor(matSelect: MatSelect, ngZone: NgZone);
17
- ngOnInit(): void;
13
+ constructor(matSelect: MatSelect, infiniteScrollService: InfiniteScrollService);
18
14
  ngAfterViewInit(): void;
15
+ getSelectItemHeightPx(panel: Element): number;
19
16
  ngOnDestroy(): void;
20
- evaluateThreshold(): void;
21
- registerScrollListener(): void;
22
- handleScrollEvent(event: any): void;
23
- getSelectItemHeightPx(): number;
24
17
  static ɵfac: i0.ɵɵFactoryDeclaration<MatSelectInfiniteScrollDirective, never>;
25
- static ɵdir: i0.ɵɵDirectiveDeclaration<MatSelectInfiniteScrollDirective, "[msInfiniteScroll]", never, { "threshold": "threshold"; "debounceTime": "debounceTime"; "complete": "complete"; }, { "infiniteScroll": "infiniteScroll"; }, never>;
18
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MatSelectInfiniteScrollDirective, "[msInfiniteScroll]", never, { "threshold": "threshold"; "debounceTime": "debounceTime"; "complete": "complete"; }, { "infiniteScroll": "infiniteScroll"; }, never, never, false, never>;
26
19
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-mat-select-infinite-scroll",
3
- "version": "3.0.1",
3
+ "version": "5.0.0-beta.1",
4
4
  "description": "Adds missing infinite scroll functionality for the angular material select component",
5
5
  "author": "Haidar Zeineddine",
6
6
  "repository": {
@@ -23,17 +23,30 @@
23
23
  ],
24
24
  "license": "MIT",
25
25
  "peerDependencies": {
26
- "@angular/core": ">=6.0.0 <14.0.0",
27
- "@angular/material": ">=6.0.0 <14.0.0"
26
+ "@angular/core": ">=15.0.0 <17.0.0",
27
+ "@angular/material": ">=15.0.0 <17.0.0"
28
+ },
29
+ "module": "fesm2015/ng-mat-select-infinite-scroll.mjs",
30
+ "es2020": "fesm2020/ng-mat-select-infinite-scroll.mjs",
31
+ "esm2020": "esm2020/ng-mat-select-infinite-scroll.mjs",
32
+ "fesm2020": "fesm2020/ng-mat-select-infinite-scroll.mjs",
33
+ "fesm2015": "fesm2015/ng-mat-select-infinite-scroll.mjs",
34
+ "typings": "index.d.ts",
35
+ "exports": {
36
+ "./package.json": {
37
+ "default": "./package.json"
38
+ },
39
+ ".": {
40
+ "types": "./index.d.ts",
41
+ "esm2020": "./esm2020/ng-mat-select-infinite-scroll.mjs",
42
+ "es2020": "./fesm2020/ng-mat-select-infinite-scroll.mjs",
43
+ "es2015": "./fesm2015/ng-mat-select-infinite-scroll.mjs",
44
+ "node": "./fesm2015/ng-mat-select-infinite-scroll.mjs",
45
+ "default": "./fesm2020/ng-mat-select-infinite-scroll.mjs"
46
+ }
28
47
  },
29
- "main": "bundles/ng-mat-select-infinite-scroll.umd.js",
30
- "module": "fesm2015/ng-mat-select-infinite-scroll.js",
31
- "es2015": "fesm2015/ng-mat-select-infinite-scroll.js",
32
- "esm2015": "esm2015/ng-mat-select-infinite-scroll.js",
33
- "fesm2015": "fesm2015/ng-mat-select-infinite-scroll.js",
34
- "typings": "ng-mat-select-infinite-scroll.d.ts",
35
48
  "sideEffects": false,
36
49
  "dependencies": {
37
- "tslib": "^2.1.0"
50
+ "tslib": "^2.3.0"
38
51
  }
39
52
  }
@@ -1,147 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs/operators'), require('rxjs'), require('@angular/material/select')) :
3
- typeof define === 'function' && define.amd ? define('ng-mat-select-infinite-scroll', ['exports', '@angular/core', 'rxjs/operators', 'rxjs', '@angular/material/select'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["ng-mat-select-infinite-scroll"] = {}, global.ng.core, global.rxjs.operators, global.rxjs, global.ng.material.select));
5
- })(this, (function (exports, i0, operators, rxjs, i1) { 'use strict';
6
-
7
- function _interopNamespace(e) {
8
- if (e && e.__esModule) return e;
9
- var n = Object.create(null);
10
- if (e) {
11
- Object.keys(e).forEach(function (k) {
12
- if (k !== 'default') {
13
- var d = Object.getOwnPropertyDescriptor(e, k);
14
- Object.defineProperty(n, k, d.get ? d : {
15
- enumerable: true,
16
- get: function () { return e[k]; }
17
- });
18
- }
19
- });
20
- }
21
- n["default"] = e;
22
- return Object.freeze(n);
23
- }
24
-
25
- var i0__namespace = /*#__PURE__*/_interopNamespace(i0);
26
- var i1__namespace = /*#__PURE__*/_interopNamespace(i1);
27
-
28
- /** The height of the select items in `em` units. */
29
- var SELECT_ITEM_HEIGHT_EM = 3;
30
- var MatSelectInfiniteScrollDirective = /** @class */ (function () {
31
- function MatSelectInfiniteScrollDirective(matSelect, ngZone) {
32
- this.matSelect = matSelect;
33
- this.ngZone = ngZone;
34
- this.threshold = '15%';
35
- this.debounceTime = 150;
36
- this.infiniteScroll = new i0.EventEmitter();
37
- this.thrPx = 0;
38
- this.thrPc = 0;
39
- this.singleOptionHeight = SELECT_ITEM_HEIGHT_EM;
40
- this.destroyed$ = new rxjs.Subject();
41
- }
42
- MatSelectInfiniteScrollDirective.prototype.ngOnInit = function () {
43
- this.evaluateThreshold();
44
- };
45
- MatSelectInfiniteScrollDirective.prototype.ngAfterViewInit = function () {
46
- var _this = this;
47
- this.matSelect.openedChange.pipe(operators.takeUntil(this.destroyed$)).subscribe(function (opened) {
48
- if (opened) {
49
- _this.panel = _this.matSelect.panel.nativeElement;
50
- _this.singleOptionHeight = _this.getSelectItemHeightPx();
51
- _this.registerScrollListener();
52
- }
53
- });
54
- };
55
- MatSelectInfiniteScrollDirective.prototype.ngOnDestroy = function () {
56
- this.destroyed$.next(true);
57
- this.destroyed$.complete();
58
- };
59
- MatSelectInfiniteScrollDirective.prototype.evaluateThreshold = function () {
60
- if (this.threshold.lastIndexOf('%') > -1) {
61
- this.thrPx = 0;
62
- this.thrPc = (parseFloat(this.threshold) / 100);
63
- }
64
- else {
65
- this.thrPx = parseFloat(this.threshold);
66
- this.thrPc = 0;
67
- }
68
- };
69
- MatSelectInfiniteScrollDirective.prototype.registerScrollListener = function () {
70
- var _this = this;
71
- rxjs.fromEvent(this.panel, 'scroll').pipe(operators.takeUntil(this.destroyed$), operators.debounceTime(this.debounceTime), operators.tap(function (event) {
72
- _this.handleScrollEvent(event);
73
- })).subscribe();
74
- };
75
- MatSelectInfiniteScrollDirective.prototype.handleScrollEvent = function (event) {
76
- var _this = this;
77
- this.ngZone.runOutsideAngular(function () {
78
- if (_this.complete) {
79
- return;
80
- }
81
- var countOfRenderedOptions = _this.matSelect.options.length;
82
- var infiniteScrollDistance = _this.singleOptionHeight * countOfRenderedOptions;
83
- var threshold = _this.thrPc !== 0 ? (infiniteScrollDistance * _this.thrPc) : _this.thrPx;
84
- var scrolledDistance = _this.panel.clientHeight + event.target.scrollTop;
85
- if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
86
- _this.ngZone.run(function () { return _this.infiniteScroll.emit(); });
87
- }
88
- });
89
- };
90
- MatSelectInfiniteScrollDirective.prototype.getSelectItemHeightPx = function () {
91
- return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
92
- };
93
- return MatSelectInfiniteScrollDirective;
94
- }());
95
- MatSelectInfiniteScrollDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0__namespace, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1__namespace.MatSelect }, { token: i0__namespace.NgZone }], target: i0__namespace.ɵɵFactoryTarget.Directive });
96
- MatSelectInfiniteScrollDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.5", type: MatSelectInfiniteScrollDirective, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete" }, outputs: { infiniteScroll: "infiniteScroll" }, ngImport: i0__namespace });
97
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0__namespace, type: MatSelectInfiniteScrollDirective, decorators: [{
98
- type: i0.Directive,
99
- args: [{
100
- selector: '[msInfiniteScroll]'
101
- }]
102
- }], ctorParameters: function () { return [{ type: i1__namespace.MatSelect }, { type: i0__namespace.NgZone }]; }, propDecorators: { threshold: [{
103
- type: i0.Input
104
- }], debounceTime: [{
105
- type: i0.Input
106
- }], complete: [{
107
- type: i0.Input
108
- }], infiniteScroll: [{
109
- type: i0.Output
110
- }] } });
111
-
112
- var MatSelectInfiniteScrollModule = /** @class */ (function () {
113
- function MatSelectInfiniteScrollModule() {
114
- }
115
- return MatSelectInfiniteScrollModule;
116
- }());
117
- MatSelectInfiniteScrollModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0__namespace, type: MatSelectInfiniteScrollModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
118
- MatSelectInfiniteScrollModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0__namespace, type: MatSelectInfiniteScrollModule, declarations: [MatSelectInfiniteScrollDirective], imports: [i1.MatSelectModule], exports: [MatSelectInfiniteScrollDirective] });
119
- MatSelectInfiniteScrollModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0__namespace, type: MatSelectInfiniteScrollModule, imports: [[
120
- i1.MatSelectModule
121
- ]] });
122
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0__namespace, type: MatSelectInfiniteScrollModule, decorators: [{
123
- type: i0.NgModule,
124
- args: [{
125
- declarations: [MatSelectInfiniteScrollDirective],
126
- imports: [
127
- i1.MatSelectModule
128
- ],
129
- exports: [MatSelectInfiniteScrollDirective]
130
- }]
131
- }] });
132
-
133
- /*
134
- * Public API Surface of ng-mat-select-infinite-scroll
135
- */
136
-
137
- /**
138
- * Generated bundle index. Do not edit.
139
- */
140
-
141
- exports.MatSelectInfiniteScrollDirective = MatSelectInfiniteScrollDirective;
142
- exports.MatSelectInfiniteScrollModule = MatSelectInfiniteScrollModule;
143
-
144
- Object.defineProperty(exports, '__esModule', { value: true });
145
-
146
- }));
147
- //# sourceMappingURL=ng-mat-select-infinite-scroll.umd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ng-mat-select-infinite-scroll.umd.js","sources":["../../../projects/ng-mat-select-infinite-scroll/src/lib/mat-select-infinite-scroll.directive.ts","../../../projects/ng-mat-select-infinite-scroll/src/lib/mat-select-infinite-scroll.module.ts","../../../projects/ng-mat-select-infinite-scroll/src/public-api.ts","../../../projects/ng-mat-select-infinite-scroll/src/ng-mat-select-infinite-scroll.ts"],"sourcesContent":["import {AfterViewInit, Directive, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output} from '@angular/core';\nimport {MatSelect} from '@angular/material/select';\nimport {debounceTime, takeUntil, tap} from 'rxjs/operators';\nimport {fromEvent, Subject} from 'rxjs';\n\n/** The height of the select items in `em` units. */\nconst SELECT_ITEM_HEIGHT_EM = 3;\n\n@Directive({\n selector: '[msInfiniteScroll]'\n})\nexport class MatSelectInfiniteScrollDirective implements OnInit, OnDestroy, AfterViewInit {\n\n @Input() threshold = '15%';\n @Input() debounceTime = 150;\n @Input() complete!: boolean;\n @Output() infiniteScroll = new EventEmitter<void>();\n\n private panel!: Element;\n private thrPx = 0;\n private thrPc = 0;\n private singleOptionHeight = SELECT_ITEM_HEIGHT_EM;\n\n private destroyed$ = new Subject<boolean>();\n\n constructor(private matSelect: MatSelect, private ngZone: NgZone) {\n }\n\n ngOnInit() {\n this.evaluateThreshold();\n }\n\n ngAfterViewInit() {\n this.matSelect.openedChange.pipe(\n takeUntil(this.destroyed$)\n ).subscribe((opened) => {\n if (opened) {\n this.panel = this.matSelect.panel.nativeElement;\n this.singleOptionHeight = this.getSelectItemHeightPx();\n this.registerScrollListener();\n }\n });\n }\n\n ngOnDestroy() {\n this.destroyed$.next(true);\n this.destroyed$.complete();\n }\n\n evaluateThreshold() {\n if (this.threshold.lastIndexOf('%') > -1) {\n this.thrPx = 0;\n this.thrPc = (parseFloat(this.threshold) / 100);\n\n } else {\n this.thrPx = parseFloat(this.threshold);\n this.thrPc = 0;\n }\n }\n\n registerScrollListener() {\n fromEvent(this.panel, 'scroll').pipe(\n takeUntil(this.destroyed$),\n debounceTime(this.debounceTime),\n tap((event) => {\n this.handleScrollEvent(event);\n })\n ).subscribe();\n }\n\n handleScrollEvent(event: any) {\n this.ngZone.runOutsideAngular(() => {\n if (this.complete) {\n return;\n }\n const countOfRenderedOptions = this.matSelect.options.length;\n const infiniteScrollDistance = this.singleOptionHeight * countOfRenderedOptions;\n const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;\n\n const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;\n\n if ((scrolledDistance + threshold) >= infiniteScrollDistance) {\n this.ngZone.run(() => this.infiniteScroll.emit());\n }\n });\n }\n\n getSelectItemHeightPx(): number {\n return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;\n }\n\n}\n","import {NgModule} from '@angular/core';\nimport {MatSelectInfiniteScrollDirective} from './mat-select-infinite-scroll.directive';\nimport {MatSelectModule} from '@angular/material/select';\n\n@NgModule({\n declarations: [MatSelectInfiniteScrollDirective],\n imports: [\n MatSelectModule\n ],\n exports: [MatSelectInfiniteScrollDirective]\n})\nexport class MatSelectInfiniteScrollModule {\n}\n","/*\n * Public API Surface of ng-mat-select-infinite-scroll\n */\n\nexport * from './lib/mat-select-infinite-scroll.directive';\nexport * from './lib/mat-select-infinite-scroll.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["EventEmitter","Subject","takeUntil","fromEvent","debounceTime","tap","Directive","Input","Output","MatSelectModule","NgModule"],"mappings":"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"}
@@ -1,85 +0,0 @@
1
- import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
- import { debounceTime, takeUntil, tap } from 'rxjs/operators';
3
- import { fromEvent, Subject } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/select";
6
- /** The height of the select items in `em` units. */
7
- const SELECT_ITEM_HEIGHT_EM = 3;
8
- export class MatSelectInfiniteScrollDirective {
9
- constructor(matSelect, ngZone) {
10
- this.matSelect = matSelect;
11
- this.ngZone = ngZone;
12
- this.threshold = '15%';
13
- this.debounceTime = 150;
14
- this.infiniteScroll = new EventEmitter();
15
- this.thrPx = 0;
16
- this.thrPc = 0;
17
- this.singleOptionHeight = SELECT_ITEM_HEIGHT_EM;
18
- this.destroyed$ = new Subject();
19
- }
20
- ngOnInit() {
21
- this.evaluateThreshold();
22
- }
23
- ngAfterViewInit() {
24
- this.matSelect.openedChange.pipe(takeUntil(this.destroyed$)).subscribe((opened) => {
25
- if (opened) {
26
- this.panel = this.matSelect.panel.nativeElement;
27
- this.singleOptionHeight = this.getSelectItemHeightPx();
28
- this.registerScrollListener();
29
- }
30
- });
31
- }
32
- ngOnDestroy() {
33
- this.destroyed$.next(true);
34
- this.destroyed$.complete();
35
- }
36
- evaluateThreshold() {
37
- if (this.threshold.lastIndexOf('%') > -1) {
38
- this.thrPx = 0;
39
- this.thrPc = (parseFloat(this.threshold) / 100);
40
- }
41
- else {
42
- this.thrPx = parseFloat(this.threshold);
43
- this.thrPc = 0;
44
- }
45
- }
46
- registerScrollListener() {
47
- fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
48
- this.handleScrollEvent(event);
49
- })).subscribe();
50
- }
51
- handleScrollEvent(event) {
52
- this.ngZone.runOutsideAngular(() => {
53
- if (this.complete) {
54
- return;
55
- }
56
- const countOfRenderedOptions = this.matSelect.options.length;
57
- const infiniteScrollDistance = this.singleOptionHeight * countOfRenderedOptions;
58
- const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
59
- const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
60
- if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
61
- this.ngZone.run(() => this.infiniteScroll.emit());
62
- }
63
- });
64
- }
65
- getSelectItemHeightPx() {
66
- return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
67
- }
68
- }
69
- MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1.MatSelect }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
70
- MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.5", type: MatSelectInfiniteScrollDirective, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete" }, outputs: { infiniteScroll: "infiniteScroll" }, ngImport: i0 });
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
72
- type: Directive,
73
- args: [{
74
- selector: '[msInfiniteScroll]'
75
- }]
76
- }], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: i0.NgZone }]; }, propDecorators: { threshold: [{
77
- type: Input
78
- }], debounceTime: [{
79
- type: Input
80
- }], complete: [{
81
- type: Input
82
- }], infiniteScroll: [{
83
- type: Output
84
- }] } });
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBNkIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9HLE9BQU8sRUFBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7QUFFeEMsb0RBQW9EO0FBQ3BELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBS2hDLE1BQU0sT0FBTyxnQ0FBZ0M7SUFjM0MsWUFBb0IsU0FBb0IsRUFBVSxNQUFjO1FBQTVDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBWnZELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFFbEIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRzVDLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsdUJBQWtCLEdBQUcscUJBQXFCLENBQUM7UUFFM0MsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFHNUMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDOUIsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFV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QUdVLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0U2VsZWN0fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2Zyb21FdmVudCwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5cbi8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QgaXRlbXMgaW4gYGVtYCB1bml0cy4gKi9cbmNvbnN0IFNFTEVDVF9JVEVNX0hFSUdIVF9FTSA9IDM7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttc0luZmluaXRlU2Nyb2xsXSdcbn0pXG5leHBvcnQgY2xhc3MgTWF0U2VsZWN0SW5maW5pdGVTY3JvbGxEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQElucHV0KCkgdGhyZXNob2xkID0gJzE1JSc7XG4gIEBJbnB1dCgpIGRlYm91bmNlVGltZSA9IDE1MDtcbiAgQElucHV0KCkgY29tcGxldGUhOiBib29sZWFuO1xuICBAT3V0cHV0KCkgaW5maW5pdGVTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBwYW5lbCE6IEVsZW1lbnQ7XG4gIHByaXZhdGUgdGhyUHggPSAwO1xuICBwcml2YXRlIHRoclBjID0gMDtcbiAgcHJpdmF0ZSBzaW5nbGVPcHRpb25IZWlnaHQgPSBTRUxFQ1RfSVRFTV9IRUlHSFRfRU07XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1hdFNlbGVjdDogTWF0U2VsZWN0LCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmV2YWx1YXRlVGhyZXNob2xkKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5tYXRTZWxlY3Qub3BlbmVkQ2hhbmdlLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKVxuICAgICkuc3Vic2NyaWJlKChvcGVuZWQpID0+IHtcbiAgICAgIGlmIChvcGVuZWQpIHtcbiAgICAgICAgdGhpcy5wYW5lbCA9IHRoaXMubWF0U2VsZWN0LnBhbmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc2luZ2xlT3B0aW9uSGVpZ2h0ID0gdGhpcy5nZXRTZWxlY3RJdGVtSGVpZ2h0UHgoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclNjcm9sbExpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGV2YWx1YXRlVGhyZXNob2xkKCkge1xuICAgIGlmICh0aGlzLnRocmVzaG9sZC5sYXN0SW5kZXhPZignJScpID4gLTEpIHtcbiAgICAgIHRoaXMudGhyUHggPSAwO1xuICAgICAgdGhpcy50aHJQYyA9IChwYXJzZUZsb2F0KHRoaXMudGhyZXNob2xkKSAvIDEwMCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aHJQeCA9IHBhcnNlRmxvYXQodGhpcy50aHJlc2hvbGQpO1xuICAgICAgdGhpcy50aHJQYyA9IDA7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcigpIHtcbiAgICBmcm9tRXZlbnQodGhpcy5wYW5lbCwgJ3Njcm9sbCcpLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSxcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSksXG4gICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsRXZlbnQoZXZlbnQpO1xuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgaGFuZGxlU2Nyb2xsRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvdW50T2ZSZW5kZXJlZE9wdGlvbnMgPSB0aGlzLm1hdFNlbGVjdC5vcHRpb25zLmxlbmd0aDtcbiAgICAgIGNvbnN0IGluZmluaXRlU2Nyb2xsRGlzdGFuY2UgPSB0aGlzLnNpbmdsZU9wdGlvbkhlaWdodCAqIGNvdW50T2ZSZW5kZXJlZE9wdGlvbnM7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLnRoclBjICE9PSAwID8gKGluZmluaXRlU2Nyb2xsRGlzdGFuY2UgKiB0aGlzLnRoclBjKSA6IHRoaXMudGhyUHg7XG5cbiAgICAgIGNvbnN0IHNjcm9sbGVkRGlzdGFuY2UgPSB0aGlzLnBhbmVsLmNsaWVudEhlaWdodCArIGV2ZW50LnRhcmdldC5zY3JvbGxUb3A7XG5cbiAgICAgIGlmICgoc2Nyb2xsZWREaXN0YW5jZSArIHRocmVzaG9sZCkgPj0gaW5maW5pdGVTY3JvbGxEaXN0YW5jZSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5pbmZpbml0ZVNjcm9sbC5lbWl0KCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2VsZWN0SXRlbUhlaWdodFB4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnBhbmVsKS5mb250U2l6ZSkgKiBTRUxFQ1RfSVRFTV9IRUlHSFRfRU07XG4gIH1cblxufVxuIl19
@@ -1,22 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { MatSelectInfiniteScrollDirective } from './mat-select-infinite-scroll.directive';
3
- import { MatSelectModule } from '@angular/material/select';
4
- import * as i0 from "@angular/core";
5
- export class MatSelectInfiniteScrollModule {
6
- }
7
- MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
- MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollModule, declarations: [MatSelectInfiniteScrollDirective], imports: [MatSelectModule], exports: [MatSelectInfiniteScrollDirective] });
9
- MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollModule, imports: [[
10
- MatSelectModule
11
- ]] });
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollModule, decorators: [{
13
- type: NgModule,
14
- args: [{
15
- declarations: [MatSelectInfiniteScrollDirective],
16
- imports: [
17
- MatSelectModule
18
- ],
19
- exports: [MatSelectInfiniteScrollDirective]
20
- }]
21
- }] });
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsZ0NBQWdDLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBU3pELE1BQU0sT0FBTyw2QkFBNkI7OzBIQUE3Qiw2QkFBNkI7MkhBQTdCLDZCQUE2QixpQkFOekIsZ0NBQWdDLGFBRTdDLGVBQWUsYUFFUCxnQ0FBZ0M7MkhBRS9CLDZCQUE2QixZQUwvQjtZQUNQLGVBQWU7U0FDaEI7MkZBR1UsNkJBQTZCO2tCQVB6QyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLGdDQUFnQyxDQUFDO29CQUNoRCxPQUFPLEVBQUU7d0JBQ1AsZUFBZTtxQkFDaEI7b0JBQ0QsT0FBTyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUJBQzVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdFNlbGVjdEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlfSBmcm9tICcuL21hdC1zZWxlY3QtaW5maW5pdGUtc2Nyb2xsLmRpcmVjdGl2ZSc7XG5pbXBvcnQge01hdFNlbGVjdE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbTWF0U2VsZWN0SW5maW5pdGVTY3JvbGxEaXJlY3RpdmVdLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0U2VsZWN0TW9kdWxlXG4gIF0sXG4gIGV4cG9ydHM6IFtNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgTWF0U2VsZWN0SW5maW5pdGVTY3JvbGxNb2R1bGUge1xufVxuIl19
@@ -1,115 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { EventEmitter, Directive, Input, Output, NgModule } from '@angular/core';
3
- import { takeUntil, debounceTime, tap } from 'rxjs/operators';
4
- import { Subject, fromEvent } from 'rxjs';
5
- import * as i1 from '@angular/material/select';
6
- import { MatSelectModule } from '@angular/material/select';
7
-
8
- /** The height of the select items in `em` units. */
9
- const SELECT_ITEM_HEIGHT_EM = 3;
10
- class MatSelectInfiniteScrollDirective {
11
- constructor(matSelect, ngZone) {
12
- this.matSelect = matSelect;
13
- this.ngZone = ngZone;
14
- this.threshold = '15%';
15
- this.debounceTime = 150;
16
- this.infiniteScroll = new EventEmitter();
17
- this.thrPx = 0;
18
- this.thrPc = 0;
19
- this.singleOptionHeight = SELECT_ITEM_HEIGHT_EM;
20
- this.destroyed$ = new Subject();
21
- }
22
- ngOnInit() {
23
- this.evaluateThreshold();
24
- }
25
- ngAfterViewInit() {
26
- this.matSelect.openedChange.pipe(takeUntil(this.destroyed$)).subscribe((opened) => {
27
- if (opened) {
28
- this.panel = this.matSelect.panel.nativeElement;
29
- this.singleOptionHeight = this.getSelectItemHeightPx();
30
- this.registerScrollListener();
31
- }
32
- });
33
- }
34
- ngOnDestroy() {
35
- this.destroyed$.next(true);
36
- this.destroyed$.complete();
37
- }
38
- evaluateThreshold() {
39
- if (this.threshold.lastIndexOf('%') > -1) {
40
- this.thrPx = 0;
41
- this.thrPc = (parseFloat(this.threshold) / 100);
42
- }
43
- else {
44
- this.thrPx = parseFloat(this.threshold);
45
- this.thrPc = 0;
46
- }
47
- }
48
- registerScrollListener() {
49
- fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
50
- this.handleScrollEvent(event);
51
- })).subscribe();
52
- }
53
- handleScrollEvent(event) {
54
- this.ngZone.runOutsideAngular(() => {
55
- if (this.complete) {
56
- return;
57
- }
58
- const countOfRenderedOptions = this.matSelect.options.length;
59
- const infiniteScrollDistance = this.singleOptionHeight * countOfRenderedOptions;
60
- const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
61
- const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
62
- if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
63
- this.ngZone.run(() => this.infiniteScroll.emit());
64
- }
65
- });
66
- }
67
- getSelectItemHeightPx() {
68
- return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
69
- }
70
- }
71
- MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1.MatSelect }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
72
- MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.5", type: MatSelectInfiniteScrollDirective, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete" }, outputs: { infiniteScroll: "infiniteScroll" }, ngImport: i0 });
73
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
74
- type: Directive,
75
- args: [{
76
- selector: '[msInfiniteScroll]'
77
- }]
78
- }], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: i0.NgZone }]; }, propDecorators: { threshold: [{
79
- type: Input
80
- }], debounceTime: [{
81
- type: Input
82
- }], complete: [{
83
- type: Input
84
- }], infiniteScroll: [{
85
- type: Output
86
- }] } });
87
-
88
- class MatSelectInfiniteScrollModule {
89
- }
90
- MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
91
- MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollModule, declarations: [MatSelectInfiniteScrollDirective], imports: [MatSelectModule], exports: [MatSelectInfiniteScrollDirective] });
92
- MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollModule, imports: [[
93
- MatSelectModule
94
- ]] });
95
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: MatSelectInfiniteScrollModule, decorators: [{
96
- type: NgModule,
97
- args: [{
98
- declarations: [MatSelectInfiniteScrollDirective],
99
- imports: [
100
- MatSelectModule
101
- ],
102
- exports: [MatSelectInfiniteScrollDirective]
103
- }]
104
- }] });
105
-
106
- /*
107
- * Public API Surface of ng-mat-select-infinite-scroll
108
- */
109
-
110
- /**
111
- * Generated bundle index. Do not edit.
112
- */
113
-
114
- export { MatSelectInfiniteScrollDirective, MatSelectInfiniteScrollModule };
115
- //# sourceMappingURL=ng-mat-select-infinite-scroll.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ng-mat-select-infinite-scroll.js","sources":["../../../projects/ng-mat-select-infinite-scroll/src/lib/mat-select-infinite-scroll.directive.ts","../../../projects/ng-mat-select-infinite-scroll/src/lib/mat-select-infinite-scroll.module.ts","../../../projects/ng-mat-select-infinite-scroll/src/public-api.ts","../../../projects/ng-mat-select-infinite-scroll/src/ng-mat-select-infinite-scroll.ts"],"sourcesContent":["import {AfterViewInit, Directive, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output} from '@angular/core';\nimport {MatSelect} from '@angular/material/select';\nimport {debounceTime, takeUntil, tap} from 'rxjs/operators';\nimport {fromEvent, Subject} from 'rxjs';\n\n/** The height of the select items in `em` units. */\nconst SELECT_ITEM_HEIGHT_EM = 3;\n\n@Directive({\n selector: '[msInfiniteScroll]'\n})\nexport class MatSelectInfiniteScrollDirective implements OnInit, OnDestroy, AfterViewInit {\n\n @Input() threshold = '15%';\n @Input() debounceTime = 150;\n @Input() complete!: boolean;\n @Output() infiniteScroll = new EventEmitter<void>();\n\n private panel!: Element;\n private thrPx = 0;\n private thrPc = 0;\n private singleOptionHeight = SELECT_ITEM_HEIGHT_EM;\n\n private destroyed$ = new Subject<boolean>();\n\n constructor(private matSelect: MatSelect, private ngZone: NgZone) {\n }\n\n ngOnInit() {\n this.evaluateThreshold();\n }\n\n ngAfterViewInit() {\n this.matSelect.openedChange.pipe(\n takeUntil(this.destroyed$)\n ).subscribe((opened) => {\n if (opened) {\n this.panel = this.matSelect.panel.nativeElement;\n this.singleOptionHeight = this.getSelectItemHeightPx();\n this.registerScrollListener();\n }\n });\n }\n\n ngOnDestroy() {\n this.destroyed$.next(true);\n this.destroyed$.complete();\n }\n\n evaluateThreshold() {\n if (this.threshold.lastIndexOf('%') > -1) {\n this.thrPx = 0;\n this.thrPc = (parseFloat(this.threshold) / 100);\n\n } else {\n this.thrPx = parseFloat(this.threshold);\n this.thrPc = 0;\n }\n }\n\n registerScrollListener() {\n fromEvent(this.panel, 'scroll').pipe(\n takeUntil(this.destroyed$),\n debounceTime(this.debounceTime),\n tap((event) => {\n this.handleScrollEvent(event);\n })\n ).subscribe();\n }\n\n handleScrollEvent(event: any) {\n this.ngZone.runOutsideAngular(() => {\n if (this.complete) {\n return;\n }\n const countOfRenderedOptions = this.matSelect.options.length;\n const infiniteScrollDistance = this.singleOptionHeight * countOfRenderedOptions;\n const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;\n\n const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;\n\n if ((scrolledDistance + threshold) >= infiniteScrollDistance) {\n this.ngZone.run(() => this.infiniteScroll.emit());\n }\n });\n }\n\n getSelectItemHeightPx(): number {\n return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;\n }\n\n}\n","import {NgModule} from '@angular/core';\nimport {MatSelectInfiniteScrollDirective} from './mat-select-infinite-scroll.directive';\nimport {MatSelectModule} from '@angular/material/select';\n\n@NgModule({\n declarations: [MatSelectInfiniteScrollDirective],\n imports: [\n MatSelectModule\n ],\n exports: [MatSelectInfiniteScrollDirective]\n})\nexport class MatSelectInfiniteScrollModule {\n}\n","/*\n * Public API Surface of ng-mat-select-infinite-scroll\n */\n\nexport * from './lib/mat-select-infinite-scroll.directive';\nexport * from './lib/mat-select-infinite-scroll.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}