ng-mat-select-infinite-scroll 4.0.0 → 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 +1 -1
- package/README.md +48 -40
- package/esm2020/lib/infinite-scroll.service.mjs +64 -0
- package/esm2020/lib/mat-select-infinite-scroll.directive.mjs +25 -51
- package/esm2020/lib/mat-select-infinite-scroll.module.mjs +6 -6
- package/fesm2015/ng-mat-select-infinite-scroll.mjs +72 -40
- package/fesm2015/ng-mat-select-infinite-scroll.mjs.map +1 -1
- package/fesm2020/ng-mat-select-infinite-scroll.mjs +72 -40
- package/fesm2020/ng-mat-select-infinite-scroll.mjs.map +1 -1
- package/lib/infinite-scroll.service.d.ts +25 -0
- package/lib/mat-select-infinite-scroll.directive.d.ts +8 -15
- package/ng-mat-select-infinite-scroll-5.0.0-beta.1.tgz +0 -0
- package/package.json +3 -3
- package/ng-mat-select-infinite-scroll-4.0.0.tgz +0 -0
package/LICENSE
CHANGED
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 [
|
|
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
|
-
|
|
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
|
|
31
|
-
import {
|
|
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,28 +60,34 @@ Then place the msInfiniteScroll directive on the `mat-select` component
|
|
|
58
60
|
</mat-form-field>
|
|
59
61
|
```
|
|
60
62
|
|
|
61
|
-
|
|
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`
|
|
62
74
|
|
|
63
|
-
|
|
64
|
-
* `@angular/cdk`: `>=6.0.0 <16`,
|
|
65
|
-
* `@angular/material`: `>=6.0.0 <16`,
|
|
66
|
-
* `rxjs`: `^7.0.0`
|
|
75
|
+
### Contributions
|
|
67
76
|
|
|
68
|
-
|
|
69
|
-
Contributions are welcomed, feel free to open a Pull-Request or open a new issue.
|
|
77
|
+
Contributions are welcome! Feel free to open a Pull Request or create a new issue.
|
|
70
78
|
|
|
71
|
-
### Development
|
|
79
|
+
### Development Server
|
|
72
80
|
|
|
73
|
-
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any
|
|
81
|
+
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any source files.
|
|
74
82
|
|
|
75
|
-
### Build
|
|
83
|
+
### Build
|
|
76
84
|
|
|
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.
|
|
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.
|
|
78
86
|
|
|
79
|
-
### Running
|
|
87
|
+
### Running Unit Tests
|
|
80
88
|
|
|
81
|
-
Run `ng test` to execute
|
|
89
|
+
Run `ng test` to execute unit tests via [Karma](https://karma-runner.github.io).
|
|
82
90
|
|
|
83
|
-
|
|
91
|
+
### License
|
|
84
92
|
|
|
85
|
-
[MIT](LICENSE)
|
|
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=
|
|
@@ -1,79 +1,53 @@
|
|
|
1
1
|
import { Directive, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { takeUntil } from 'rxjs/operators';
|
|
3
|
+
import { InfiniteScrollService } from "./infinite-scroll.service";
|
|
4
|
+
import { Subject } from "rxjs";
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
import * as i1 from "@angular/material/select";
|
|
7
|
+
import * as i2 from "./infinite-scroll.service";
|
|
6
8
|
/** The height of the select items in `em` units. */
|
|
7
9
|
const SELECT_ITEM_HEIGHT_EM = 3;
|
|
8
10
|
export class MatSelectInfiniteScrollDirective {
|
|
9
|
-
constructor(matSelect,
|
|
11
|
+
constructor(matSelect, infiniteScrollService) {
|
|
10
12
|
this.matSelect = matSelect;
|
|
11
|
-
this.
|
|
13
|
+
this.infiniteScrollService = infiniteScrollService;
|
|
12
14
|
this.threshold = '15%';
|
|
13
15
|
this.debounceTime = 150;
|
|
14
16
|
this.infiniteScroll = new EventEmitter();
|
|
15
|
-
this.thrPx = 0;
|
|
16
|
-
this.thrPc = 0;
|
|
17
|
-
this.singleOptionHeight = SELECT_ITEM_HEIGHT_EM;
|
|
18
17
|
this.destroyed$ = new Subject();
|
|
19
18
|
}
|
|
20
|
-
ngOnInit() {
|
|
21
|
-
this.evaluateThreshold();
|
|
22
|
-
}
|
|
23
19
|
ngAfterViewInit() {
|
|
24
20
|
this.matSelect.openedChange.pipe(takeUntil(this.destroyed$)).subscribe((opened) => {
|
|
25
21
|
if (opened) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.
|
|
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());
|
|
29
30
|
}
|
|
30
31
|
});
|
|
31
32
|
}
|
|
33
|
+
getSelectItemHeightPx(panel) {
|
|
34
|
+
return parseFloat(getComputedStyle(panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
|
|
35
|
+
}
|
|
32
36
|
ngOnDestroy() {
|
|
33
37
|
this.destroyed$.next(true);
|
|
34
38
|
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;
|
|
39
|
+
this.infiniteScrollService.destroy();
|
|
67
40
|
}
|
|
68
41
|
}
|
|
69
|
-
MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
70
|
-
MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
71
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
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: [{
|
|
72
45
|
type: Directive,
|
|
73
46
|
args: [{
|
|
74
|
-
selector: '[msInfiniteScroll]'
|
|
47
|
+
selector: '[msInfiniteScroll]',
|
|
48
|
+
providers: [InfiniteScrollService]
|
|
75
49
|
}]
|
|
76
|
-
}], ctorParameters: function () { return [{ type: i1.MatSelect }, { type:
|
|
50
|
+
}], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: i2.InfiniteScrollService }]; }, propDecorators: { threshold: [{
|
|
77
51
|
type: Input
|
|
78
52
|
}], debounceTime: [{
|
|
79
53
|
type: Input
|
|
@@ -82,4 +56,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
82
56
|
}], infiniteScroll: [{
|
|
83
57
|
type: Output
|
|
84
58
|
}] } });
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBNkIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9HLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7O0FBRTdCLG9EQUFvRDtBQUNwRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQU1oQyxNQUFNLE9BQU8sZ0NBQWdDO0lBU3pDLFlBQXNCLFNBQW9CLEVBQVUscUJBQTRDO1FBQTFFLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBVSwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBUHZGLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFFbEIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTVDLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBRzVDLENBQUM7SUFHRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUM3QixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ25CLElBQUksTUFBTSxFQUFFO2dCQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDakQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFO29CQUM3RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2lCQUMxQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUN2RjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQWM7UUFDaEMsT0FBTyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcscUJBQXFCLENBQUM7SUFDaEYsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6QyxDQUFDOzs4SEF4Q1EsZ0NBQWdDO2tIQUFoQyxnQ0FBZ0Msb0xBRjlCLENBQUMscUJBQXFCLENBQUM7NEZBRXpCLGdDQUFnQztrQkFKNUMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDckM7b0lBR1ksU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRTZWxlY3R9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtJbmZpbml0ZVNjcm9sbFNlcnZpY2V9IGZyb20gXCIuL2luZmluaXRlLXNjcm9sbC5zZXJ2aWNlXCI7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XG5cbi8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QgaXRlbXMgaW4gYGVtYCB1bml0cy4gKi9cbmNvbnN0IFNFTEVDVF9JVEVNX0hFSUdIVF9FTSA9IDM7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21zSW5maW5pdGVTY3JvbGxdJyxcbiAgICBwcm92aWRlcnM6IFtJbmZpbml0ZVNjcm9sbFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAgIEBJbnB1dCgpIHRocmVzaG9sZCA9ICcxNSUnO1xuICAgIEBJbnB1dCgpIGRlYm91bmNlVGltZSA9IDE1MDtcbiAgICBASW5wdXQoKSBjb21wbGV0ZSE6IGJvb2xlYW47XG4gICAgQE91dHB1dCgpIGluZmluaXRlU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBtYXRTZWxlY3Q6IE1hdFNlbGVjdCwgcHJpdmF0ZSBpbmZpbml0ZVNjcm9sbFNlcnZpY2U6IEluZmluaXRlU2Nyb2xsU2VydmljZSkge1xuICAgIH1cblxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm1hdFNlbGVjdC5vcGVuZWRDaGFuZ2UucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpXG4gICAgICAgICkuc3Vic2NyaWJlKChvcGVuZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChvcGVuZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMubWF0U2VsZWN0LnBhbmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0SXRlbUhlaWdodFB4ID0gdGhpcy5nZXRTZWxlY3RJdGVtSGVpZ2h0UHgocGFuZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxTZXJ2aWNlLmluaXRpYWxpemUocGFuZWwsIHNlbGVjdEl0ZW1IZWlnaHRQeCwge1xuICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWU6IHRoaXMuZGVib3VuY2VUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogdGhpcy5jb21wbGV0ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbFNlcnZpY2UucmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcigoKSA9PiB0aGlzLmluZmluaXRlU2Nyb2xsLmVtaXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFNlbGVjdEl0ZW1IZWlnaHRQeChwYW5lbDogRWxlbWVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUocGFuZWwpLmZvbnRTaXplKSAqIFNFTEVDVF9JVEVNX0hFSUdIVF9FTTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuXG4gICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxTZXJ2aWNlLmRlc3Ryb3koKTtcbiAgICB9XG5cbn1cbiJdfQ==
|
|
@@ -4,17 +4,17 @@ import { MatSelectModule } from '@angular/material/select';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export class MatSelectInfiniteScrollModule {
|
|
6
6
|
}
|
|
7
|
-
MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
8
|
-
MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
9
|
-
MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
10
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
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
11
|
type: NgModule,
|
|
12
12
|
args: [{
|
|
13
13
|
declarations: [MatSelectInfiniteScrollDirective],
|
|
14
14
|
imports: [
|
|
15
|
-
MatSelectModule
|
|
15
|
+
MatSelectModule,
|
|
16
16
|
],
|
|
17
17
|
exports: [MatSelectInfiniteScrollDirective]
|
|
18
18
|
}]
|
|
19
19
|
}] });
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsZ0NBQWdDLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBU3pELE1BQU0sT0FBTyw2QkFBNkI7OzJIQUE3Qiw2QkFBNkI7NEhBQTdCLDZCQUE2QixpQkFOdkIsZ0NBQWdDLGFBRTNDLGVBQWUsYUFFVCxnQ0FBZ0M7NEhBRWpDLDZCQUE2QixZQUpsQyxlQUFlOzRGQUlWLDZCQUE2QjtrQkFQekMsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQztvQkFDaEQsT0FBTyxFQUFFO3dCQUNMLGVBQWU7cUJBQ2xCO29CQUNELE9BQU8sRUFBRSxDQUFDLGdDQUFnQyxDQUFDO2lCQUM5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZX0gZnJvbSAnLi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtNYXRTZWxlY3RNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbTWF0U2VsZWN0SW5maW5pdGVTY3JvbGxEaXJlY3RpdmVdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIF0sXG4gICAgZXhwb3J0czogW01hdFNlbGVjdEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbE1vZHVsZSB7XG59XG4iXX0=
|
|
@@ -1,40 +1,27 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Directive, Input, Output, NgModule } from '@angular/core';
|
|
2
|
+
import { Injectable, EventEmitter, Directive, Input, Output, NgModule } from '@angular/core';
|
|
3
3
|
import { takeUntil, debounceTime, tap } from 'rxjs/operators';
|
|
4
4
|
import { Subject, fromEvent } from 'rxjs';
|
|
5
5
|
import * as i1 from '@angular/material/select';
|
|
6
6
|
import { MatSelectModule } from '@angular/material/select';
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class MatSelectInfiniteScrollDirective {
|
|
11
|
-
constructor(matSelect, ngZone) {
|
|
12
|
-
this.matSelect = matSelect;
|
|
8
|
+
class InfiniteScrollService {
|
|
9
|
+
constructor(ngZone) {
|
|
13
10
|
this.ngZone = ngZone;
|
|
14
11
|
this.threshold = '15%';
|
|
15
12
|
this.debounceTime = 150;
|
|
16
|
-
this.infiniteScroll = new EventEmitter();
|
|
17
13
|
this.thrPx = 0;
|
|
18
14
|
this.thrPc = 0;
|
|
19
|
-
this.singleOptionHeight = SELECT_ITEM_HEIGHT_EM;
|
|
20
15
|
this.destroyed$ = new Subject();
|
|
21
16
|
}
|
|
22
|
-
|
|
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
23
|
this.evaluateThreshold();
|
|
24
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
25
|
evaluateThreshold() {
|
|
39
26
|
if (this.threshold.lastIndexOf('%') > -1) {
|
|
40
27
|
this.thrPx = 0;
|
|
@@ -45,37 +32,82 @@ class MatSelectInfiniteScrollDirective {
|
|
|
45
32
|
this.thrPc = 0;
|
|
46
33
|
}
|
|
47
34
|
}
|
|
48
|
-
registerScrollListener() {
|
|
35
|
+
registerScrollListener(infiniteScrollCallback) {
|
|
49
36
|
fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
|
|
50
|
-
this.handleScrollEvent(event);
|
|
37
|
+
this.handleScrollEvent(event, infiniteScrollCallback);
|
|
51
38
|
})).subscribe();
|
|
52
39
|
}
|
|
53
|
-
handleScrollEvent(event) {
|
|
40
|
+
handleScrollEvent(event, infiniteScrollCallback) {
|
|
54
41
|
this.ngZone.runOutsideAngular(() => {
|
|
55
42
|
if (this.complete) {
|
|
56
43
|
return;
|
|
57
44
|
}
|
|
58
|
-
const countOfRenderedOptions = this.
|
|
59
|
-
const infiniteScrollDistance = this.
|
|
45
|
+
const countOfRenderedOptions = Math.round(this.panel.scrollHeight / this.selectItemHeightPx);
|
|
46
|
+
const infiniteScrollDistance = this.selectItemHeightPx * countOfRenderedOptions;
|
|
60
47
|
const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
|
|
61
48
|
const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
|
|
62
49
|
if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
|
|
63
|
-
this.ngZone.run(
|
|
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());
|
|
64
90
|
}
|
|
65
91
|
});
|
|
66
92
|
}
|
|
67
|
-
getSelectItemHeightPx() {
|
|
68
|
-
return parseFloat(getComputedStyle(
|
|
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();
|
|
69
100
|
}
|
|
70
101
|
}
|
|
71
|
-
MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
72
|
-
MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
73
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
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: [{
|
|
74
105
|
type: Directive,
|
|
75
106
|
args: [{
|
|
76
|
-
selector: '[msInfiniteScroll]'
|
|
107
|
+
selector: '[msInfiniteScroll]',
|
|
108
|
+
providers: [InfiniteScrollService]
|
|
77
109
|
}]
|
|
78
|
-
}], ctorParameters: function () { return [{ type: i1.MatSelect }, { type:
|
|
110
|
+
}], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: InfiniteScrollService }]; }, propDecorators: { threshold: [{
|
|
79
111
|
type: Input
|
|
80
112
|
}], debounceTime: [{
|
|
81
113
|
type: Input
|
|
@@ -87,15 +119,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
87
119
|
|
|
88
120
|
class MatSelectInfiniteScrollModule {
|
|
89
121
|
}
|
|
90
|
-
MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
91
|
-
MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
92
|
-
MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
93
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
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: [{
|
|
94
126
|
type: NgModule,
|
|
95
127
|
args: [{
|
|
96
128
|
declarations: [MatSelectInfiniteScrollDirective],
|
|
97
129
|
imports: [
|
|
98
|
-
MatSelectModule
|
|
130
|
+
MatSelectModule,
|
|
99
131
|
],
|
|
100
132
|
exports: [MatSelectInfiniteScrollDirective]
|
|
101
133
|
}]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-mat-select-infinite-scroll.mjs","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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"}
|
|
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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"}
|
|
@@ -1,40 +1,27 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Directive, Input, Output, NgModule } from '@angular/core';
|
|
2
|
+
import { Injectable, EventEmitter, Directive, Input, Output, NgModule } from '@angular/core';
|
|
3
3
|
import { takeUntil, debounceTime, tap } from 'rxjs/operators';
|
|
4
4
|
import { Subject, fromEvent } from 'rxjs';
|
|
5
5
|
import * as i1 from '@angular/material/select';
|
|
6
6
|
import { MatSelectModule } from '@angular/material/select';
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class MatSelectInfiniteScrollDirective {
|
|
11
|
-
constructor(matSelect, ngZone) {
|
|
12
|
-
this.matSelect = matSelect;
|
|
8
|
+
class InfiniteScrollService {
|
|
9
|
+
constructor(ngZone) {
|
|
13
10
|
this.ngZone = ngZone;
|
|
14
11
|
this.threshold = '15%';
|
|
15
12
|
this.debounceTime = 150;
|
|
16
|
-
this.infiniteScroll = new EventEmitter();
|
|
17
13
|
this.thrPx = 0;
|
|
18
14
|
this.thrPc = 0;
|
|
19
|
-
this.singleOptionHeight = SELECT_ITEM_HEIGHT_EM;
|
|
20
15
|
this.destroyed$ = new Subject();
|
|
21
16
|
}
|
|
22
|
-
|
|
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
23
|
this.evaluateThreshold();
|
|
24
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
25
|
evaluateThreshold() {
|
|
39
26
|
if (this.threshold.lastIndexOf('%') > -1) {
|
|
40
27
|
this.thrPx = 0;
|
|
@@ -45,37 +32,82 @@ class MatSelectInfiniteScrollDirective {
|
|
|
45
32
|
this.thrPc = 0;
|
|
46
33
|
}
|
|
47
34
|
}
|
|
48
|
-
registerScrollListener() {
|
|
35
|
+
registerScrollListener(infiniteScrollCallback) {
|
|
49
36
|
fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
|
|
50
|
-
this.handleScrollEvent(event);
|
|
37
|
+
this.handleScrollEvent(event, infiniteScrollCallback);
|
|
51
38
|
})).subscribe();
|
|
52
39
|
}
|
|
53
|
-
handleScrollEvent(event) {
|
|
40
|
+
handleScrollEvent(event, infiniteScrollCallback) {
|
|
54
41
|
this.ngZone.runOutsideAngular(() => {
|
|
55
42
|
if (this.complete) {
|
|
56
43
|
return;
|
|
57
44
|
}
|
|
58
|
-
const countOfRenderedOptions = this.
|
|
59
|
-
const infiniteScrollDistance = this.
|
|
45
|
+
const countOfRenderedOptions = Math.round(this.panel.scrollHeight / this.selectItemHeightPx);
|
|
46
|
+
const infiniteScrollDistance = this.selectItemHeightPx * countOfRenderedOptions;
|
|
60
47
|
const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
|
|
61
48
|
const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
|
|
62
49
|
if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
|
|
63
|
-
this.ngZone.run(
|
|
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());
|
|
64
90
|
}
|
|
65
91
|
});
|
|
66
92
|
}
|
|
67
|
-
getSelectItemHeightPx() {
|
|
68
|
-
return parseFloat(getComputedStyle(
|
|
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();
|
|
69
100
|
}
|
|
70
101
|
}
|
|
71
|
-
MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
72
|
-
MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
73
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
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: [{
|
|
74
105
|
type: Directive,
|
|
75
106
|
args: [{
|
|
76
|
-
selector: '[msInfiniteScroll]'
|
|
107
|
+
selector: '[msInfiniteScroll]',
|
|
108
|
+
providers: [InfiniteScrollService]
|
|
77
109
|
}]
|
|
78
|
-
}], ctorParameters: function () { return [{ type: i1.MatSelect }, { type:
|
|
110
|
+
}], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: InfiniteScrollService }]; }, propDecorators: { threshold: [{
|
|
79
111
|
type: Input
|
|
80
112
|
}], debounceTime: [{
|
|
81
113
|
type: Input
|
|
@@ -87,15 +119,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
87
119
|
|
|
88
120
|
class MatSelectInfiniteScrollModule {
|
|
89
121
|
}
|
|
90
|
-
MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
91
|
-
MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
92
|
-
MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
93
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
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: [{
|
|
94
126
|
type: NgModule,
|
|
95
127
|
args: [{
|
|
96
128
|
declarations: [MatSelectInfiniteScrollDirective],
|
|
97
129
|
imports: [
|
|
98
|
-
MatSelectModule
|
|
130
|
+
MatSelectModule,
|
|
99
131
|
],
|
|
100
132
|
exports: [MatSelectInfiniteScrollDirective]
|
|
101
133
|
}]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-mat-select-infinite-scroll.mjs","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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"}
|
|
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,
|
|
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
|
|
5
|
-
|
|
6
|
-
private
|
|
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,
|
|
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, never, false>;
|
|
18
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<MatSelectInfiniteScrollDirective, "[msInfiniteScroll]", never, { "threshold": "threshold"; "debounceTime": "debounceTime"; "complete": "complete"; }, { "infiniteScroll": "infiniteScroll"; }, never, never, false, never>;
|
|
26
19
|
}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ng-mat-select-infinite-scroll",
|
|
3
|
-
"version": "
|
|
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,8 +23,8 @@
|
|
|
23
23
|
],
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"@angular/core": ">=
|
|
27
|
-
"@angular/material": ">=
|
|
26
|
+
"@angular/core": ">=15.0.0 <17.0.0",
|
|
27
|
+
"@angular/material": ">=15.0.0 <17.0.0"
|
|
28
28
|
},
|
|
29
29
|
"module": "fesm2015/ng-mat-select-infinite-scroll.mjs",
|
|
30
30
|
"es2020": "fesm2020/ng-mat-select-infinite-scroll.mjs",
|
|
Binary file
|