ng-mat-select-infinite-scroll 5.0.0-beta.2 → 6.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,93 +1,135 @@
1
+ # Angular Material Select Infinite Scroll
1
2
 
2
- # Angular Material Select Infinite Scroll
3
+ Load options in pages as users scroll a standard Angular Material `mat-select`. Supports standalone imports and the existing NgModule API.
3
4
 
4
- Adds missing infinite scroll functionality for the [Angular Material Select component](https://material.angular.io/components/select).
5
+ ## Version compatibility
5
6
 
6
- ### Inputs
7
+ The 6.0 release candidate targets Angular/Material **15.2–22**. It is compiled with Angular 15.2 partial Ivy and checked as one npm tarball in independent applications for every major, including minimum-version fixtures. See [compatibility.json](compatibility.json) for exact test toolchains and [the execution status](REVIVAL_STATUS.md) for validation progress. A candidate is not a published stable release.
7
8
 
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` |
9
+ | Your application | Package |
10
+ | --- | --- |
11
+ | Angular/Material 15.2–22 | Upcoming 6.x; use `@next` only after the candidate is published |
12
+ | Angular/Material 15–16 | Existing `5.0.0-beta.3`; excludes the 6.x fixes |
13
+ | Angular below 15 | Historical `4.0.0` declares peers `>=6 <15`; verify your exact versions |
13
14
 
14
- ### Outputs
15
+ Angular and Material should use matching majors. The 6.x line uses RxJS 7.8+. Standard `MatSelect` is covered; `MatLegacySelect` is a separate integration. An older framework's compatibility entry does not extend its upstream security support.
15
16
 
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
23
- npm i ng-mat-select-infinite-scroll
17
+ ```sh
18
+ # Once the candidate is published:
19
+ npm install ng-mat-select-infinite-scroll@next
24
20
  ```
25
21
 
26
- ### Usage
22
+ ## Standalone usage
27
23
 
28
- [StackBlitz working example](https://stackblitz.com/edit/ng-mat-select-infinite-scroll)
29
-
30
- Import `MatSelectInfiniteScrollModule` inside the `app.module.ts`:
31
- ```typescript
24
+ ```ts
25
+ import { Component } from '@angular/core';
26
+ import { CommonModule } from '@angular/common';
32
27
  import { MatFormFieldModule } from '@angular/material/form-field';
33
28
  import { MatSelectModule } from '@angular/material/select';
34
- import { MatSelectInfiniteScrollModule } from 'ng-mat-select-infinite-scroll';
35
-
36
- @NgModule({
37
- declarations: [
38
- AppComponent
39
- ],
40
- imports: [
41
- BrowserModule,
42
- BrowserAnimationsModule,
43
- MatFormFieldModule,
44
- MatSelectModule,
45
- MatSelectInfiniteScrollModule
46
- ],
47
- providers: [],
48
- bootstrap: [AppComponent]
29
+ import { MatSelectInfiniteScrollDirective } from 'ng-mat-select-infinite-scroll';
30
+
31
+ @Component({
32
+ standalone: true,
33
+ imports: [CommonModule, MatFormFieldModule, MatSelectModule, MatSelectInfiniteScrollDirective],
34
+ template: `
35
+ <mat-form-field>
36
+ <mat-label>Customer</mat-label>
37
+ <mat-select msInfiniteScroll [loading]="loading" [complete]="complete"
38
+ (infiniteScroll)="loadNextPage()">
39
+ <mat-option *ngFor="let item of options" [value]="item.id">
40
+ {{ item.name }}
41
+ </mat-option>
42
+ </mat-select>
43
+ </mat-form-field>
44
+ `
49
45
  })
50
- export class AppModule {}
46
+ export class CustomerSelect {
47
+ options: Array<{ id: number; name: string }> = [];
48
+ loading = false;
49
+ complete = false;
50
+ // Fetch the initial page before opening an empty select.
51
+ loadNextPage() { /* guarded server request; see below */ }
52
+ }
51
53
  ```
52
54
 
53
- Then, place the `msInfiniteScroll` directive on the `mat-select` component:
54
- ```html
55
- <mat-form-field appearance="outline">
56
- <mat-label>Select</mat-label>
57
- <mat-select msInfiniteScroll (infiniteScroll)="getNextBatch()" [complete]="offset === data.length">
58
- <mat-option *ngFor="let option of options$ | async" [value]="option">{{option}}</mat-option>
59
- </mat-select>
60
- </mat-form-field>
55
+ On Angular 22 use `@for (item of options; track item.id) { ... }` instead of the removed `*ngFor`. Configure animations according to your application's Angular/Material version.
56
+
57
+ For NgModule applications, import `MatSelectInfiniteScrollModule` alongside `MatSelectModule` and `MatFormFieldModule`. Existing `msInfiniteScroll` templates continue to work.
58
+
59
+ ## API
60
+
61
+ | Input | Default | Behavior |
62
+ | --- | --- | --- |
63
+ | `complete` | `false` | Suppresses output immediately, including changes while the panel is open. Reset for a new query. |
64
+ | `loading` | `false` | Suppresses output while a page is in flight. Bind this to the application's request state. |
65
+ | `threshold` | `'15%'` | Distance from the bottom: `0`–`100%`, a pixel string such as `'100px'`, or a numeric string such as `'100'`. |
66
+ | `debounceTime` | `150` | Non-negative milliseconds to wait after a scroll event. |
67
+
68
+ `(infiniteScroll)` emits `void` when more options are needed. Inputs remain live while open. Invalid thresholds and non-finite/negative debounce values throw `RangeError`.
69
+
70
+ The directive checks the rendered panel on opening, after option changes, and when loading/completion inputs change. This allows a preselected last item or a short page to request more without another scroll. Automatic requests are bounded by changes to the rendered list; a failed or empty response does not cause an automatic retry loop. User scrolling can request again. Close/destroy cancels pending work.
71
+
72
+ ## Loading pages safely
73
+
74
+ Fetch the first page in your component's initialization. Keep HTTP, offsets, cancellation, errors, and caching in the application:
75
+
76
+ ```ts
77
+ loadNextPage() {
78
+ if (this.loading || this.complete) return;
79
+ this.loading = true;
80
+ this.error = null;
81
+ this.api.getCustomers({ query: this.query, offset: this.options.length, limit: 20 })
82
+ .pipe(finalize(() => { this.loading = false; }))
83
+ .subscribe({
84
+ next: page => {
85
+ this.options = [...this.options, ...page.items];
86
+ this.complete = this.options.length >= page.total || page.items.length === 0;
87
+ },
88
+ error: error => { this.error = error; }
89
+ });
90
+ }
61
91
  ```
62
92
 
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.
93
+ Import `finalize` from RxJS. In a zoneless/OnPush component, use signals or mark the view for checking when asynchronous fields change. Cancel in-flight requests on destruction and query reset; a stale response must not append to a new query. Offer an explicit retry action after an error.
66
94
 
67
- ### Compatibility
95
+ For server search, cancel the previous query (for example with `switchMap`), reset options/page/completion, and request the new first page. Search inputs can live outside `mat-select`; this directive does not implement filtering. For repeated selects in a FormArray, share a data-service cache keyed by query/filter/page and deduplicate in-flight requests there.
68
96
 
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`
97
+ ## Selection and layout
74
98
 
75
- ### Contributions
99
+ - Append options with stable IDs/identity. When clearing pages or filtering, retain the selected options separately or fetch them by ID; `compareWith` cannot recreate a removed option.
100
+ - Keep the Material panel as the scrolling container. Arbitrary nested scrolling `div` elements are not supported. Standard options and optgroups are supported.
101
+ - Appending pages preserves the panel's scroll position. **Material can still reset its active keyboard item to the selected option when the option list changes.** The compatibility browser checks record this upstream behavior; the library does not modify private Material key-manager fields. See [known limitations](docs/KNOWN_LIMITATIONS.md).
76
102
 
77
- Contributions are welcome! Feel free to open a Pull Request or create a new issue.
103
+ ## Migration from 4.x / 5.x
78
104
 
79
- ### Development Server
105
+ Keep the same selector, output, and NgModule import, or switch to the standalone directive. Add `[loading]` to prevent overlapping requests. Set/reset `[complete]` when your query finishes or changes. Review the stricter threshold validation and the new opening/short-list checks; requests can occur on opening without a new scroll event. Use the compatibility table instead of bypassing npm peers.
80
106
 
81
- Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any source files.
107
+ ## Development
82
108
 
83
- ### Build
109
+ ```sh
110
+ nvm use
111
+ npm ci --ignore-scripts
112
+ npm ci --prefix tools/build-library --ignore-scripts
113
+ npm test
114
+ npm run build
115
+ npm run check:policy
116
+ ```
84
117
 
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.
118
+ The library builder intentionally uses Angular 15.2 and Node 18 in isolation. Browser orchestration and publication use Node 24.15. See [compatibility checks](compat/README.md) for per-version commands. Build output, tarballs, and browser receipts are ignored.
119
+
120
+ The interactive demo uses its own Angular 22 toolchain. After building the library:
121
+
122
+ ```sh
123
+ cd projects/example
124
+ nvm use
125
+ npm ci --ignore-scripts
126
+ npm start
127
+ ```
86
128
 
87
- ### Running Unit Tests
129
+ PR CI validates the actual tarball; the publishing workflow repeats the checks and uses npm trusted publishing. Stable publication requires the approved version, beta feedback, and the full matrix. See [request and selection recipes](docs/RECIPES.md) for shared caching and reset behavior.
88
130
 
89
- Run `ng test` to execute unit tests via [Karma](https://karma-runner.github.io).
131
+ Contributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
90
132
 
91
- ### License
133
+ ## License
92
134
 
93
- [MIT](LICENSE)
135
+ [MIT](LICENSE)
@@ -1,64 +1,73 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { fromEvent, Subject } from 'rxjs';
3
- import { debounceTime, takeUntil, tap } from 'rxjs/operators';
2
+ import { debounce, fromEvent, timer } from 'rxjs';
4
3
  import * as i0 from "@angular/core";
5
4
  export class InfiniteScrollService {
6
5
  constructor(ngZone) {
7
6
  this.ngZone = ngZone;
8
- this.threshold = '15%';
9
- this.debounceTime = 150;
10
- this.thrPx = 0;
11
- this.thrPc = 0;
12
- this.destroyed$ = new Subject();
7
+ this.optionCount = 0;
13
8
  }
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;
9
+ validate(config) {
10
+ this.thresholdPixels(config.threshold, 1);
11
+ if (!Number.isFinite(config.debounceTime) || config.debounceTime < 0) {
12
+ throw new RangeError('debounceTime must be a finite, non-negative number');
30
13
  }
31
14
  }
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) {
15
+ connect(panel, configuration, callback) {
16
+ this.disconnect();
17
+ this.validate(configuration());
18
+ this.panel = panel;
19
+ this.configuration = configuration;
20
+ this.callback = callback;
38
21
  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
- }
22
+ this.subscription = fromEvent(panel, 'scroll').pipe(debounce(() => timer(configuration().debounceTime))).subscribe(() => this.check(this.optionCount, false));
49
23
  });
50
24
  }
51
- destroy() {
52
- this.destroyed$.next();
53
- this.destroyed$.complete();
25
+ check(optionCount, automatic = true) {
26
+ this.optionCount = optionCount;
27
+ const panel = this.panel;
28
+ const config = this.configuration?.();
29
+ if (!panel || !config || config.complete || config.loading || panel.clientHeight <= 0)
30
+ return;
31
+ const threshold = this.thresholdPixels(config.threshold, panel.scrollHeight);
32
+ const remaining = panel.scrollHeight - panel.clientHeight - panel.scrollTop;
33
+ if (remaining > threshold + 0.5)
34
+ return;
35
+ // An automatic check can request again only after the rendered list changes.
36
+ // A failed/empty page must not cause an unbounded automatic request loop.
37
+ const key = `${panel.scrollHeight}:${panel.clientHeight}:${optionCount}`;
38
+ if (automatic && key === this.lastRequestKey)
39
+ return;
40
+ this.lastRequestKey = key;
41
+ if (this.callback)
42
+ this.ngZone.run(this.callback);
43
+ }
44
+ reset() {
45
+ this.lastRequestKey = undefined;
46
+ }
47
+ disconnect() {
48
+ // Unsubscribing discards pending debounce timers instead of flushing them.
49
+ this.subscription?.unsubscribe();
50
+ this.subscription = undefined;
51
+ this.panel = undefined;
52
+ this.configuration = undefined;
53
+ this.callback = undefined;
54
+ this.optionCount = 0;
55
+ this.reset();
56
+ }
57
+ thresholdPixels(value, height) {
58
+ const match = /^(\d+(?:\.\d+)?|\.\d+)(%|px)?$/.exec(String(value).trim());
59
+ if (!match || !Number.isFinite(Number(match[1]))) {
60
+ throw new RangeError('threshold must be a non-negative percentage or pixel distance');
61
+ }
62
+ const distance = Number(match[1]);
63
+ if (match[2] === '%' && distance > 100)
64
+ throw new RangeError('percentage threshold must not exceed 100%');
65
+ return match[2] === '%' ? height * distance / 100 : distance;
54
66
  }
55
67
  }
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
- }]
68
+ InfiniteScrollService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: InfiniteScrollService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
69
+ InfiniteScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: InfiniteScrollService });
70
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: InfiniteScrollService, decorators: [{
71
+ type: Injectable
63
72
  }], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5maW5pdGUtc2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC9zcmMvbGliL2luZmluaXRlLXNjcm9sbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7O0FBSzVELE1BQU0sT0FBTyxxQkFBcUI7SUFXOUIsWUFBb0IsTUFBYztRQUFkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFUMUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFHLEdBQUcsQ0FBQztRQUVuQixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBS3pDLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYyxFQUFFLGtCQUEwQixFQUFFLE1BSXREO1FBQ0csSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDbkQ7YUFBTTtZQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNsQjtJQUNMLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxzQkFBa0M7UUFDckQsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUNoQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUMvQixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FDTCxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFVLEVBQUUsc0JBQWtDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDZixPQUFPO2FBQ1Y7WUFDRCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDN0YsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsc0JBQXNCLENBQUM7WUFDaEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBRXhGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFFMUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxJQUFJLHNCQUFzQixFQUFFO2dCQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2FBQzNDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDOzttSEFwRVEscUJBQXFCO3VIQUFyQixxQkFBcUIsY0FGbEIsTUFBTTs0RkFFVCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgSW5maW5pdGVTY3JvbGxTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgdGhyZXNob2xkID0gJzE1JSc7XG4gICAgcHJpdmF0ZSBkZWJvdW5jZVRpbWUgPSAxNTA7XG4gICAgcHJpdmF0ZSBjb21wbGV0ZSE6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSB0aHJQeCA9IDA7XG4gICAgcHJpdmF0ZSB0aHJQYyA9IDA7XG4gICAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIHNlbGVjdEl0ZW1IZWlnaHRQeCE6IG51bWJlcjtcbiAgICBwcml2YXRlIHBhbmVsITogRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKHBhbmVsOiBFbGVtZW50LCBzZWxlY3RJdGVtSGVpZ2h0UHg6IG51bWJlciwgY29uZmlnOiB7XG4gICAgICAgIHRocmVzaG9sZDogc3RyaW5nLFxuICAgICAgICBkZWJvdW5jZVRpbWU6IG51bWJlcixcbiAgICAgICAgY29tcGxldGU6IGJvb2xlYW5cbiAgICB9KSB7XG4gICAgICAgIHRoaXMudGhyZXNob2xkID0gY29uZmlnLnRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5kZWJvdW5jZVRpbWUgPSBjb25maWcuZGVib3VuY2VUaW1lO1xuICAgICAgICB0aGlzLmNvbXBsZXRlID0gY29uZmlnLmNvbXBsZXRlO1xuXG4gICAgICAgIHRoaXMucGFuZWwgPSBwYW5lbDtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtSGVpZ2h0UHggPSBzZWxlY3RJdGVtSGVpZ2h0UHg7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVUaHJlc2hvbGQoKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVRocmVzaG9sZCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyZXNob2xkLmxhc3RJbmRleE9mKCclJykgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy50aHJQeCA9IDA7XG4gICAgICAgICAgICB0aGlzLnRoclBjID0gKHBhcnNlRmxvYXQodGhpcy50aHJlc2hvbGQpIC8gMTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGhyUHggPSBwYXJzZUZsb2F0KHRoaXMudGhyZXNob2xkKTtcbiAgICAgICAgICAgIHRoaXMudGhyUGMgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcihpbmZpbml0ZVNjcm9sbENhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLnBhbmVsLCAnc2Nyb2xsJykucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpLFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKSxcbiAgICAgICAgICAgIHRhcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbEV2ZW50KGV2ZW50LCBpbmZpbml0ZVNjcm9sbENhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlU2Nyb2xsRXZlbnQoZXZlbnQ6IGFueSwgaW5maW5pdGVTY3JvbGxDYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvdW50T2ZSZW5kZXJlZE9wdGlvbnMgPSBNYXRoLnJvdW5kKHRoaXMucGFuZWwuc2Nyb2xsSGVpZ2h0IC8gdGhpcy5zZWxlY3RJdGVtSGVpZ2h0UHgpO1xuICAgICAgICAgICAgY29uc3QgaW5maW5pdGVTY3JvbGxEaXN0YW5jZSA9IHRoaXMuc2VsZWN0SXRlbUhlaWdodFB4ICogY291bnRPZlJlbmRlcmVkT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMudGhyUGMgIT09IDAgPyAoaW5maW5pdGVTY3JvbGxEaXN0YW5jZSAqIHRoaXMudGhyUGMpIDogdGhpcy50aHJQeDtcblxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZWREaXN0YW5jZSA9IHRoaXMucGFuZWwuY2xpZW50SGVpZ2h0ICsgZXZlbnQudGFyZ2V0LnNjcm9sbFRvcDtcblxuICAgICAgICAgICAgaWYgKChzY3JvbGxlZERpc3RhbmNlICsgdGhyZXNob2xkKSA+PSBpbmZpbml0ZVNjcm9sbERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKGluZmluaXRlU2Nyb2xsQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iXX0=
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5maW5pdGUtc2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90b29scy9idWlsZC1saWJyYXJ5Ly5zdGFnZS9zcmMvbGliL2luZmluaXRlLXNjcm9sbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFVaEUsTUFBTSxPQUFPLHFCQUFxQjtJQVFoQyxZQUE2QixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUZuQyxnQkFBVyxHQUFHLENBQUMsQ0FBQztJQUVzQixDQUFDO0lBRS9DLFFBQVEsQ0FBQyxNQUEyQjtRQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFO1lBQ3BFLE1BQU0sSUFBSSxVQUFVLENBQUMsb0RBQW9ELENBQUMsQ0FBQztTQUM1RTtJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsS0FBa0IsRUFBRSxhQUF3QyxFQUFFLFFBQW9CO1FBQ3hGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFB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QUEyQyxDQUFDLENBQUM7UUFDMUcsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQy9ELENBQUM7O2tIQXRFVSxxQkFBcUI7c0hBQXJCLHFCQUFxQjsyRkFBckIscUJBQXFCO2tCQURqQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZSwgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsQ29uZmlndXJhdGlvbiB7XG4gIHRocmVzaG9sZDogc3RyaW5nO1xuICBkZWJvdW5jZVRpbWU6IG51bWJlcjtcbiAgY29tcGxldGU6IGJvb2xlYW47XG4gIGxvYWRpbmc6IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJbmZpbml0ZVNjcm9sbFNlcnZpY2Uge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBwYW5lbD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGNvbmZpZ3VyYXRpb24/OiAoKSA9PiBTY3JvbGxDb25maWd1cmF0aW9uO1xuICBwcml2YXRlIGNhbGxiYWNrPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEtleT86IHN0cmluZztcbiAgcHJpdmF0ZSBvcHRpb25Db3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZSkge31cblxuICB2YWxpZGF0ZShjb25maWc6IFNjcm9sbENvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnRocmVzaG9sZFBpeGVscyhjb25maWcudGhyZXNob2xkLCAxKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShjb25maWcuZGVib3VuY2VUaW1lKSB8fCBjb25maWcuZGVib3VuY2VUaW1lIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2RlYm91bmNlVGltZSBtdXN0IGJlIGEgZmluaXRlLCBub24tbmVnYXRpdmUgbnVtYmVyJyk7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdChwYW5lbDogSFRNTEVsZW1lbnQsIGNvbmZpZ3VyYXRpb246ICgpID0+IFNjcm9sbENvbmZpZ3VyYXRpb24sIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy52YWxpZGF0ZShjb25maWd1cmF0aW9uKCkpO1xuICAgIHRoaXMucGFuZWwgPSBwYW5lbDtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IGZyb21FdmVudChwYW5lbCwgJ3Njcm9sbCcpLnBpcGUoXG4gICAgICAgIGRlYm91bmNlKCgpID0+IHRpbWVyKGNvbmZpZ3VyYXRpb24oKS5kZWJvdW5jZVRpbWUpKVxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jaGVjayh0aGlzLm9wdGlvbkNvdW50LCBmYWxzZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgY2hlY2sob3B0aW9uQ291bnQ6IG51bWJlciwgYXV0b21hdGljID0gdHJ1ZSk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9uQ291bnQgPSBvcHRpb25Db3VudDtcbiAgICBjb25zdCBwYW5lbCA9IHRoaXMucGFuZWw7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWd1cmF0aW9uPy4oKTtcbiAgICBpZiAoIXBhbmVsIHx8ICFjb25maWcgfHwgY29uZmlnLmNvbXBsZXRlIHx8IGNvbmZpZy5sb2FkaW5nIHx8IHBhbmVsLmNsaWVudEhlaWdodCA8PSAwKSByZXR1cm47XG4gICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy50aHJlc2hvbGRQaXhlbHMoY29uZmlnLnRocmVzaG9sZCwgcGFuZWwuc2Nyb2xsSGVpZ2h0KTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBwYW5lbC5zY3JvbGxIZWlnaHQgLSBwYW5lbC5jbGllbnRIZWlnaHQgLSBwYW5lbC5zY3JvbGxUb3A7XG4gICAgaWYgKHJlbWFpbmluZyA+IHRocmVzaG9sZCArIDAuNSkgcmV0dXJuO1xuXG4gICAgLy8gQW4gYXV0b21hdGljIGNoZWNrIGNhbiByZXF1ZXN0IGFnYWluIG9ubHkgYWZ0ZXIgdGhlIHJlbmRlcmVkIGxpc3QgY2hhbmdlcy5cbiAgICAvLyBBIGZhaWxlZC9lbXB0eSBwYWdlIG11c3Qgbm90IGNhdXNlIGFuIHVuYm91bmRlZCBhdXRvbWF0aWMgcmVxdWVzdCBsb29wLlxuICAgIGNvbnN0IGtleSA9IGAke3BhbmVsLnNjcm9sbEhlaWdodH06JHtwYW5lbC5jbGllbnRIZWlnaHR9OiR7b3B0aW9uQ291bnR9YDtcbiAgICBpZiAoYXV0b21hdGljICYmIGtleSA9PT0gdGhpcy5sYXN0UmVxdWVzdEtleSkgcmV0dXJuO1xuICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSBrZXk7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2spIHRoaXMubmdab25lLnJ1bih0aGlzLmNhbGxiYWNrKTtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubGFzdFJlcXVlc3RLZXkgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIC8vIFVuc3Vic2NyaWJpbmcgZGlzY2FyZHMgcGVuZGluZyBkZWJvdW5jZSB0aW1lcnMgaW5zdGVhZCBvZiBmbHVzaGluZyB0aGVtLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucGFuZWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vcHRpb25Db3VudCA9IDA7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJlc2hvbGRQaXhlbHModmFsdWU6IHN0cmluZywgaGVpZ2h0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1hdGNoID0gL14oXFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSglfHB4KT8kLy5leGVjKFN0cmluZyh2YWx1ZSkudHJpbSgpKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKG1hdGNoWzFdKSkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0aHJlc2hvbGQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBwZXJjZW50YWdlIG9yIHBpeGVsIGRpc3RhbmNlJyk7XG4gICAgfVxuICAgIGNvbnN0IGRpc3RhbmNlID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICBpZiAobWF0Y2hbMl0gPT09ICclJyAmJiBkaXN0YW5jZSA+IDEwMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3BlcmNlbnRhZ2UgdGhyZXNob2xkIG11c3Qgbm90IGV4Y2VlZCAxMDAlJyk7XG4gICAgcmV0dXJuIG1hdGNoWzJdID09PSAnJScgPyBoZWlnaHQgKiBkaXN0YW5jZSAvIDEwMCA6IGRpc3RhbmNlO1xuICB9XG59XG4iXX0=
@@ -1,52 +1,112 @@
1
1
  import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
- import { delay, takeUntil } from 'rxjs/operators';
3
- import { InfiniteScrollService } from "./infinite-scroll.service";
4
- import { Subject } from "rxjs";
2
+ import { Subscription } from 'rxjs';
3
+ import { InfiniteScrollService } from './infinite-scroll.service';
5
4
  import * as i0 from "@angular/core";
6
5
  import * as i1 from "@angular/material/select";
7
6
  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
7
  export class MatSelectInfiniteScrollDirective {
11
- constructor(matSelect, infiniteScrollService) {
8
+ constructor(matSelect, scroll) {
12
9
  this.matSelect = matSelect;
13
- this.infiniteScrollService = infiniteScrollService;
10
+ this.scroll = scroll;
14
11
  this.threshold = '15%';
15
12
  this.debounceTime = 150;
13
+ this.complete = false;
14
+ this.loading = false;
16
15
  this.infiniteScroll = new EventEmitter();
17
- this.destroyed$ = new Subject();
16
+ this.subscriptions = new Subscription();
17
+ this.connected = false;
18
+ this.destroyed = false;
19
+ this.optionCount = 0;
20
+ }
21
+ ngOnChanges(changes) {
22
+ this.scroll.validate(this.configuration());
23
+ if (changes['complete']?.previousValue === true && !this.complete)
24
+ this.scroll.reset();
25
+ this.scheduleCheck();
18
26
  }
19
27
  ngAfterViewInit() {
20
- this.matSelect.openedChange.pipe(
21
- //Wait for the panel to be rendered (https://github.com/angular/components/issues/30596)
22
- delay(0), takeUntil(this.destroyed$)).subscribe((opened) => {
23
- if (opened) {
24
- const panel = this.matSelect.panel.nativeElement;
25
- const selectItemHeightPx = this.getSelectItemHeightPx(panel);
26
- this.infiniteScrollService.initialize(panel, selectItemHeightPx, {
27
- threshold: this.threshold,
28
- debounceTime: this.debounceTime,
29
- complete: this.complete
30
- });
31
- this.infiniteScrollService.registerScrollListener(() => this.infiniteScroll.emit());
28
+ this.subscriptions.add(this.matSelect.openedChange.subscribe(opened => {
29
+ if (!opened)
30
+ this.closePanel();
31
+ else if (!this.connected && this.openTimer === undefined)
32
+ this.openPanel();
33
+ else
34
+ this.scheduleCheck();
35
+ }));
36
+ this.subscriptions.add(this.matSelect.stateChanges.subscribe(() => {
37
+ if (!this.matSelect.panelOpen)
38
+ this.closePanel();
39
+ else if (!this.connected && this.openTimer === undefined)
40
+ this.openPanel();
41
+ }));
42
+ this.subscriptions.add(this.matSelect.options.changes.subscribe(() => {
43
+ const count = this.matSelect.options.length;
44
+ if (this.connected && this.optionCount > 0 && count > this.optionCount &&
45
+ this.matSelect.options.get(this.optionCount - 1) === this.lastOption) {
46
+ this.scrollAnchor = this.matSelect.panel?.nativeElement.scrollTop;
32
47
  }
48
+ this.optionCount = count;
49
+ this.lastOption = this.matSelect.options.last;
50
+ this.scheduleCheck();
51
+ }));
52
+ if (this.matSelect.panelOpen)
53
+ this.openPanel();
54
+ }
55
+ ngOnDestroy() {
56
+ this.destroyed = true;
57
+ this.closePanel();
58
+ this.subscriptions.unsubscribe();
59
+ }
60
+ openPanel() {
61
+ // Material versions differ in when the overlay panel becomes available.
62
+ this.openTimer = setTimeout(() => {
63
+ this.openTimer = undefined;
64
+ const panel = this.matSelect.panel?.nativeElement;
65
+ if (this.destroyed || !this.matSelect.panelOpen || !panel)
66
+ return;
67
+ this.scroll.connect(panel, () => this.configuration(), () => this.infiniteScroll.emit());
68
+ this.connected = true;
69
+ this.optionCount = this.matSelect.options.length;
70
+ this.lastOption = this.matSelect.options.last;
71
+ this.scheduleCheck();
33
72
  });
34
73
  }
35
- getSelectItemHeightPx(panel) {
36
- return parseFloat(getComputedStyle(panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
74
+ closePanel() {
75
+ clearTimeout(this.openTimer);
76
+ clearTimeout(this.checkTimer);
77
+ this.openTimer = undefined;
78
+ this.checkTimer = undefined;
79
+ this.connected = false;
80
+ this.scrollAnchor = undefined;
81
+ this.lastOption = undefined;
82
+ this.scroll.disconnect();
37
83
  }
38
- ngOnDestroy() {
39
- this.destroyed$.next(true);
40
- this.destroyed$.complete();
41
- this.infiniteScrollService.destroy();
84
+ scheduleCheck() {
85
+ if (!this.connected || this.destroyed)
86
+ return;
87
+ clearTimeout(this.checkTimer);
88
+ this.checkTimer = setTimeout(() => {
89
+ this.checkTimer = undefined;
90
+ if (this.connected && this.matSelect.panelOpen) {
91
+ if (this.scrollAnchor !== undefined) {
92
+ this.matSelect.panel.nativeElement.scrollTop = this.scrollAnchor;
93
+ this.scrollAnchor = undefined;
94
+ }
95
+ this.scroll.check(this.matSelect.options.length);
96
+ }
97
+ });
98
+ }
99
+ configuration() {
100
+ return { threshold: this.threshold, debounceTime: this.debounceTime, complete: this.complete || !this.matSelect.panelOpen, loading: this.loading };
42
101
  }
43
102
  }
44
- 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 });
45
- 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 });
46
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
103
+ MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1.MatSelect }, { token: i2.InfiniteScrollService }], target: i0.ɵɵFactoryTarget.Directive });
104
+ MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.0", type: MatSelectInfiniteScrollDirective, isStandalone: true, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete", loading: "loading" }, outputs: { infiniteScroll: "infiniteScroll" }, providers: [InfiniteScrollService], usesOnChanges: true, ngImport: i0 });
105
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
47
106
  type: Directive,
48
107
  args: [{
49
108
  selector: '[msInfiniteScroll]',
109
+ standalone: true,
50
110
  providers: [InfiniteScrollService]
51
111
  }]
52
112
  }], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: i2.InfiniteScrollService }]; }, propDecorators: { threshold: [{
@@ -55,7 +115,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
55
115
  type: Input
56
116
  }], complete: [{
57
117
  type: Input
118
+ }], loading: [{
119
+ type: Input
58
120
  }], infiniteScroll: [{
59
121
  type: Output
60
122
  }] } });
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBNkIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9HLE9BQU8sRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQzs7OztBQUU3QixvREFBb0Q7QUFDcEQsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFNaEMsTUFBTSxPQUFPLGdDQUFnQztJQVN6QyxZQUFzQixTQUFvQixFQUFVLHFCQUE0QztRQUExRSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVUsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQVB2RixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsR0FBRyxDQUFDO1FBRWxCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUU1QyxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztJQUc1QyxDQUFDO0lBR0QsZUFBZTtRQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUk7UUFDNUIsd0ZBQXdGO1FBQ3hGLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUM3QixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ25CLElBQUksTUFBTSxFQUFFO2dCQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDakQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFO29CQUM3RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2lCQUMxQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUN2RjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQWM7UUFDaEMsT0FBTyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcscUJBQXFCLENBQUM7SUFDaEYsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6QyxDQUFDOzs4SEExQ1EsZ0NBQWdDO2tIQUFoQyxnQ0FBZ0Msb0xBRjlCLENBQUMscUJBQXFCLENBQUM7NEZBRXpCLGdDQUFnQztrQkFKNUMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDckM7b0lBR1ksU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRTZWxlY3R9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQge2RlbGF5LCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7SW5maW5pdGVTY3JvbGxTZXJ2aWNlfSBmcm9tIFwiLi9pbmZpbml0ZS1zY3JvbGwuc2VydmljZVwiO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xuXG4vKiogVGhlIGhlaWdodCBvZiB0aGUgc2VsZWN0IGl0ZW1zIGluIGBlbWAgdW5pdHMuICovXG5jb25zdCBTRUxFQ1RfSVRFTV9IRUlHSFRfRU0gPSAzO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttc0luZmluaXRlU2Nyb2xsXScsXG4gICAgcHJvdmlkZXJzOiBbSW5maW5pdGVTY3JvbGxTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICBASW5wdXQoKSB0aHJlc2hvbGQgPSAnMTUlJztcbiAgICBASW5wdXQoKSBkZWJvdW5jZVRpbWUgPSAxNTA7XG4gICAgQElucHV0KCkgY29tcGxldGUhOiBib29sZWFuO1xuICAgIEBPdXRwdXQoKSBpbmZpbml0ZVNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIHByaXZhdGUgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbWF0U2VsZWN0OiBNYXRTZWxlY3QsIHByaXZhdGUgaW5maW5pdGVTY3JvbGxTZXJ2aWNlOiBJbmZpbml0ZVNjcm9sbFNlcnZpY2UpIHtcbiAgICB9XG5cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5tYXRTZWxlY3Qub3BlbmVkQ2hhbmdlLnBpcGUoXG4gICAgICAgICAgICAvL1dhaXQgZm9yIHRoZSBwYW5lbCB0byBiZSByZW5kZXJlZCAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMzA1OTYpXG4gICAgICAgICAgICBkZWxheSgwKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpXG4gICAgICAgICkuc3Vic2NyaWJlKChvcGVuZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChvcGVuZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMubWF0U2VsZWN0LnBhbmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0SXRlbUhlaWdodFB4ID0gdGhpcy5nZXRTZWxlY3RJdGVtSGVpZ2h0UHgocGFuZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxTZXJ2aWNlLmluaXRpYWxpemUocGFuZWwsIHNlbGVjdEl0ZW1IZWlnaHRQeCwge1xuICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudGhyZXNob2xkLFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWU6IHRoaXMuZGVib3VuY2VUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogdGhpcy5jb21wbGV0ZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbFNlcnZpY2UucmVnaXN0ZXJTY3JvbGxMaXN0ZW5lcigoKSA9PiB0aGlzLmluZmluaXRlU2Nyb2xsLmVtaXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFNlbGVjdEl0ZW1IZWlnaHRQeChwYW5lbDogRWxlbWVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUocGFuZWwpLmZvbnRTaXplKSAqIFNFTEVDVF9JVEVNX0hFSUdIVF9FTTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuXG4gICAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxTZXJ2aWNlLmRlc3Ryb3koKTtcbiAgICB9XG5cbn1cbiJdfQ==
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG9vbHMvYnVpbGQtbGlicmFyeS8uc3RhZ2Uvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBd0IsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUUzSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQU92RixNQUFNLE9BQU8sZ0NBQWdDO0lBZ0IzQyxZQUErQixTQUFvQixFQUFtQixNQUE2QjtRQUFwRSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQW1CLFdBQU0sR0FBTixNQUFNLENBQXVCO1FBZjFGLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2YsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRW5DLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUc1QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZ0JBQVcsR0FBRyxDQUFDLENBQUM7SUFJOEUsQ0FBQztJQUV2RyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxR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b0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDakUsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7aUJBQy9CO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2xEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYTtRQUNuQixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JKLENBQUM7OzZIQS9GVSxnQ0FBZ0M7aUhBQWhDLGdDQUFnQyw0TkFGaEMsQ0FBQyxxQkFBcUIsQ0FBQzsyRkFFdkIsZ0NBQWdDO2tCQUw1QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDbkM7b0lBRVUsU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluZmluaXRlU2Nyb2xsU2VydmljZSwgU2Nyb2xsQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vaW5maW5pdGUtc2Nyb2xsLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbXNJbmZpbml0ZVNjcm9sbF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBwcm92aWRlcnM6IFtJbmZpbml0ZVNjcm9sbFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0aHJlc2hvbGQgPSAnMTUlJztcbiAgQElucHV0KCkgZGVib3VuY2VUaW1lID0gMTUwO1xuICBASW5wdXQoKSBjb21wbGV0ZSA9IGZhbHNlO1xuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBpbmZpbml0ZVNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgb3BlblRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgY2hlY2tUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIG9wdGlvbkNvdW50ID0gMDtcbiAgcHJpdmF0ZSBsYXN0T3B0aW9uOiB1bmtub3duO1xuICBwcml2YXRlIHNjcm9sbEFuY2hvcj86IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgbWF0U2VsZWN0OiBNYXRTZWxlY3QsIHByaXZhdGUgcmVhZG9ubHkgc2Nyb2xsOiBJbmZpbml0ZVNjcm9sbFNlcnZpY2UpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsLnZhbGlkYXRlKHRoaXMuY29uZmlndXJhdGlvbigpKTtcbiAgICBpZiAoY2hhbmdlc1snY29tcGxldGUnXT8ucHJldmlvdXNWYWx1ZSA9PT0gdHJ1ZSAmJiAhdGhpcy5jb21wbGV0ZSkgdGhpcy5zY3JvbGwucmVzZXQoKTtcbiAgICB0aGlzLnNjaGVkdWxlQ2hlY2soKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubWF0U2VsZWN0Lm9wZW5lZENoYW5nZS5zdWJzY3JpYmUob3BlbmVkID0+IHtcbiAgICAgIGlmICghb3BlbmVkKSB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLm9wZW5UaW1lciA9PT0gdW5kZWZpbmVkKSB0aGlzLm9wZW5QYW5lbCgpO1xuICAgICAgZWxzZSB0aGlzLnNjaGVkdWxlQ2hlY2soKTtcbiAgICB9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLm1hdFNlbGVjdC5zdGF0ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuKSB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLm9wZW5UaW1lciA9PT0gdW5kZWZpbmVkKSB0aGlzLm9wZW5QYW5lbCgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMubWF0U2VsZWN0Lm9wdGlvbnMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgY291bnQgPSB0aGlzLm1hdFNlbGVjdC5vcHRpb25zLmxlbmd0aDtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLm9wdGlvbkNvdW50ID4gMCAmJiBjb3VudCA+IHRoaXMub3B0aW9uQ291bnQgJiZcbiAgICAgICAgICB0aGlzLm1hdFNlbGVjdC5vcHRpb25zLmdldCh0aGlzLm9wdGlvbkNvdW50IC0gMSkgPT09IHRoaXMubGFzdE9wdGlvbikge1xuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvciA9IHRoaXMubWF0U2VsZWN0LnBhbmVsPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9uQ291bnQgPSBjb3VudDtcbiAgICAgIHRoaXMubGFzdE9wdGlvbiA9IHRoaXMubWF0U2VsZWN0Lm9wdGlvbnMubGFzdDtcbiAgICAgIHRoaXMuc2NoZWR1bGVDaGVjaygpO1xuICAgIH0pKTtcbiAgICBpZiAodGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuKSB0aGlzLm9wZW5QYW5lbCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuUGFuZWwoKTogdm9pZCB7XG4gICAgLy8gTWF0ZXJpYWwgdmVyc2lvbnMgZGlmZmVyIGluIHdoZW4gdGhlIG92ZXJsYXkgcGFuZWwgYmVjb21lcyBhdmFpbGFibGUuXG4gICAgdGhpcy5vcGVuVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMub3BlblRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLm1hdFNlbGVjdC5wYW5lbD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCAhdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuIHx8ICFwYW5lbCkgcmV0dXJuO1xuICAgICAgdGhpcy5zY3JvbGwuY29ubmVjdChwYW5lbCwgKCkgPT4gdGhpcy5jb25maWd1cmF0aW9uKCksICgpID0+IHRoaXMuaW5maW5pdGVTY3JvbGwuZW1pdCgpKTtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMub3B0aW9uQ291bnQgPSB0aGlzLm1hdFNlbGVjdC5vcHRpb25zLmxlbmd0aDtcbiAgICAgIHRoaXMubGFzdE9wdGlvbiA9IHRoaXMubWF0U2VsZWN0Lm9wdGlvbnMubGFzdDtcbiAgICAgIHRoaXMuc2NoZWR1bGVDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVBhbmVsKCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLm9wZW5UaW1lcik7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2hlY2tUaW1lcik7XG4gICAgdGhpcy5vcGVuVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGVja1RpbWVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5zY3JvbGxBbmNob3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sYXN0T3B0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2Nyb2xsLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVDaGVjaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGVkIHx8IHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2hlY2tUaW1lcik7XG4gICAgdGhpcy5jaGVja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5jb25uZWN0ZWQgJiYgdGhpcy5tYXRTZWxlY3QucGFuZWxPcGVuKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbEFuY2hvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5tYXRTZWxlY3QucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbEFuY2hvcjtcbiAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbC5jaGVjayh0aGlzLm1hdFNlbGVjdC5vcHRpb25zLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyYXRpb24oKTogU2Nyb2xsQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHsgdGhyZXNob2xkOiB0aGlzLnRocmVzaG9sZCwgZGVib3VuY2VUaW1lOiB0aGlzLmRlYm91bmNlVGltZSwgY29tcGxldGU6IHRoaXMuY29tcGxldGUgfHwgIXRoaXMubWF0U2VsZWN0LnBhbmVsT3BlbiwgbG9hZGluZzogdGhpcy5sb2FkaW5nIH07XG4gIH1cbn1cbiJdfQ==
@@ -4,17 +4,18 @@ 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: "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: [{
7
+ MatSelectInfiniteScrollModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: MatSelectInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
+ MatSelectInfiniteScrollModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.0", ngImport: i0, type: MatSelectInfiniteScrollModule, imports: [MatSelectModule,
9
+ MatSelectInfiniteScrollDirective], exports: [MatSelectInfiniteScrollDirective] });
10
+ MatSelectInfiniteScrollModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: MatSelectInfiniteScrollModule, imports: [MatSelectModule] });
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: MatSelectInfiniteScrollModule, decorators: [{
11
12
  type: NgModule,
12
13
  args: [{
13
- declarations: [MatSelectInfiniteScrollDirective],
14
14
  imports: [
15
15
  MatSelectModule,
16
+ MatSelectInfiniteScrollDirective,
16
17
  ],
17
18
  exports: [MatSelectInfiniteScrollDirective]
18
19
  }]
19
20
  }] });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsZ0NBQWdDLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBU3pELE1BQU0sT0FBTyw2QkFBNkI7OzJIQUE3Qiw2QkFBNkI7NEhBQTdCLDZCQUE2QixpQkFOdkIsZ0NBQWdDLGFBRTNDLGVBQWUsYUFFVCxnQ0FBZ0M7NEhBRWpDLDZCQUE2QixZQUpsQyxlQUFlOzRGQUlWLDZCQUE2QjtrQkFQekMsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQztvQkFDaEQsT0FBTyxFQUFFO3dCQUNMLGVBQWU7cUJBQ2xCO29CQUNELE9BQU8sRUFBRSxDQUFDLGdDQUFnQyxDQUFDO2lCQUM5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZX0gZnJvbSAnLi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtNYXRTZWxlY3RNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbTWF0U2VsZWN0SW5maW5pdGVTY3JvbGxEaXJlY3RpdmVdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIF0sXG4gICAgZXhwb3J0czogW01hdFNlbGVjdEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbE1vZHVsZSB7XG59XG4iXX0=
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG9vbHMvYnVpbGQtbGlicmFyeS8uc3RhZ2Uvc3JjL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsZ0NBQWdDLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUN4RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7O0FBU3pELE1BQU0sT0FBTyw2QkFBNkI7OzBIQUE3Qiw2QkFBNkI7MkhBQTdCLDZCQUE2QixZQUxsQyxlQUFlO1FBQ2YsZ0NBQWdDLGFBRTFCLGdDQUFnQzsySEFFakMsNkJBQTZCLFlBTGxDLGVBQWU7MkZBS1YsNkJBQTZCO2tCQVB6QyxRQUFRO21CQUFDO29CQUNOLE9BQU8sRUFBRTt3QkFDTCxlQUFlO3dCQUNmLGdDQUFnQztxQkFDbkM7b0JBQ0QsT0FBTyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUJBQzlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdFNlbGVjdEluZmluaXRlU2Nyb2xsRGlyZWN0aXZlfSBmcm9tICcuL21hdC1zZWxlY3QtaW5maW5pdGUtc2Nyb2xsLmRpcmVjdGl2ZSc7XG5pbXBvcnQge01hdFNlbGVjdE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICAgICAgTWF0U2VsZWN0SW5maW5pdGVTY3JvbGxEaXJlY3RpdmUsXG4gICAgXSxcbiAgICBleHBvcnRzOiBbTWF0U2VsZWN0SW5maW5pdGVTY3JvbGxEaXJlY3RpdmVdXG59KVxuZXhwb3J0IGNsYXNzIE1hdFNlbGVjdEluZmluaXRlU2Nyb2xsTW9kdWxlIHtcbn1cbiJdfQ==
@@ -2,4 +2,4 @@
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
4
  export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9uZy1tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC9zcmMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90b29scy9idWlsZC1saWJyYXJ5Ly5zdGFnZS9zcmMvbmctbWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -3,4 +3,4 @@
3
3
  */
4
4
  export * from './lib/mat-select-infinite-scroll.directive';
5
5
  export * from './lib/mat-select-infinite-scroll.module';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25nLW1hdC1zZWxlY3QtaW5maW5pdGUtc2Nyb2xsL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHlDQUF5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZy1tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL21hdC1zZWxlY3QtaW5maW5pdGUtc2Nyb2xsLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5tb2R1bGUnO1xuIl19
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rvb2xzL2J1aWxkLWxpYnJhcnkvLnN0YWdlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHlDQUF5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZy1tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL21hdC1zZWxlY3QtaW5maW5pdGUtc2Nyb2xsLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tYXQtc2VsZWN0LWluZmluaXRlLXNjcm9sbC5tb2R1bGUnO1xuIl19