@apipass/inputs 1.0.7 → 1.0.8

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.
Files changed (64) hide show
  1. package/ace-editor/component.d.ts +52 -52
  2. package/ace-editor/directive.d.ts +39 -39
  3. package/custom-select/custom-select-item.d.ts +5 -5
  4. package/custom-select/custom-select.component.d.ts +51 -51
  5. package/debounce-model-directive/debouceInput.directive.d.ts +14 -14
  6. package/esm2022/ace-editor/component.mjs +200 -0
  7. package/esm2022/ace-editor/directive.mjs +153 -0
  8. package/{esm2020 → esm2022}/apipass-inputs.mjs +4 -4
  9. package/esm2022/custom-select/custom-select-item.mjs +9 -0
  10. package/esm2022/custom-select/custom-select.component.mjs +213 -0
  11. package/esm2022/debounce-model-directive/debouceInput.directive.mjs +34 -0
  12. package/esm2022/field/field.component.mjs +56 -0
  13. package/esm2022/input-avatar/input-avatar.component.mjs +91 -0
  14. package/esm2022/input-boolean/input-boolean.component.mjs +54 -0
  15. package/esm2022/input-file/input-file.component.mjs +82 -0
  16. package/esm2022/input-number/input-number.component.mjs +60 -0
  17. package/esm2022/input-password/input-password.component.mjs +94 -0
  18. package/esm2022/input-text/input-text.component.mjs +60 -0
  19. package/esm2022/inputs.module.mjs +150 -0
  20. package/{esm2020 → esm2022}/public-api.mjs +16 -16
  21. package/{esm2020 → esm2022}/select-box/mat-select-infinite-scroll.directive.mjs +91 -86
  22. package/esm2022/select-box/select-box.component.mjs +226 -0
  23. package/esm2022/select-enum/select-enum.component.mjs +47 -0
  24. package/esm2022/select-interpolation/select-interpolation.component.mjs +177 -0
  25. package/esm2022/value-acessor-base.mjs +30 -0
  26. package/fesm2022/apipass-inputs.mjs +1711 -0
  27. package/fesm2022/apipass-inputs.mjs.map +1 -0
  28. package/field/field.component.d.ts +15 -15
  29. package/index.d.ts +5 -5
  30. package/input-avatar/input-avatar.component.d.ts +29 -29
  31. package/input-boolean/input-boolean.component.d.ts +15 -15
  32. package/input-file/input-file.component.d.ts +31 -31
  33. package/input-number/input-number.component.d.ts +17 -17
  34. package/input-password/input-password.component.d.ts +28 -28
  35. package/input-text/input-text.component.d.ts +17 -17
  36. package/inputs.module.d.ts +36 -36
  37. package/package.json +18 -24
  38. package/public-api.d.ts +16 -16
  39. package/select-box/mat-select-infinite-scroll.directive.d.ts +26 -26
  40. package/select-box/select-box.component.d.ts +57 -57
  41. package/select-enum/select-enum.component.d.ts +12 -12
  42. package/select-interpolation/select-interpolation.component.d.ts +44 -44
  43. package/value-acessor-base.d.ts +13 -13
  44. package/esm2020/ace-editor/component.mjs +0 -195
  45. package/esm2020/ace-editor/directive.mjs +0 -148
  46. package/esm2020/custom-select/custom-select-item.mjs +0 -7
  47. package/esm2020/custom-select/custom-select.component.mjs +0 -204
  48. package/esm2020/debounce-model-directive/debouceInput.directive.mjs +0 -31
  49. package/esm2020/field/field.component.mjs +0 -51
  50. package/esm2020/input-avatar/input-avatar.component.mjs +0 -92
  51. package/esm2020/input-boolean/input-boolean.component.mjs +0 -56
  52. package/esm2020/input-file/input-file.component.mjs +0 -82
  53. package/esm2020/input-number/input-number.component.mjs +0 -62
  54. package/esm2020/input-password/input-password.component.mjs +0 -96
  55. package/esm2020/input-text/input-text.component.mjs +0 -62
  56. package/esm2020/inputs.module.mjs +0 -149
  57. package/esm2020/select-box/select-box.component.mjs +0 -225
  58. package/esm2020/select-enum/select-enum.component.mjs +0 -48
  59. package/esm2020/select-interpolation/select-interpolation.component.mjs +0 -169
  60. package/esm2020/value-acessor-base.mjs +0 -31
  61. package/fesm2015/apipass-inputs.mjs +0 -1706
  62. package/fesm2015/apipass-inputs.mjs.map +0 -1
  63. package/fesm2020/apipass-inputs.mjs +0 -1696
  64. package/fesm2020/apipass-inputs.mjs.map +0 -1
@@ -1,86 +1,91 @@
1
- import { Directive, EventEmitter, Input, NgZone, Output } from '@angular/core';
2
- import { MatSelect } from '@angular/material/select';
3
- import { debounceTime, takeUntil, tap } from 'rxjs/operators';
4
- import { fromEvent, Subject } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/material/select";
7
- /** The height of the select items in `em` units. */
8
- const SELECT_ITEM_HEIGHT_EM = 3;
9
- export class MatSelectInfiniteScrollDirective {
10
- constructor(matSelect, ngZone) {
11
- this.matSelect = matSelect;
12
- this.ngZone = ngZone;
13
- this.threshold = '15%';
14
- this.debounceTime = 150;
15
- this.infiniteScroll = new EventEmitter();
16
- this.thrPx = 0;
17
- this.thrPc = 0;
18
- this.singleOptionHeight = SELECT_ITEM_HEIGHT_EM;
19
- this.destroyed$ = new Subject();
20
- }
21
- ngOnInit() {
22
- this.evaluateThreshold();
23
- }
24
- ngAfterViewInit() {
25
- this.matSelect.openedChange.pipe(takeUntil(this.destroyed$)).subscribe((opened) => {
26
- if (opened) {
27
- this.panel = this.matSelect.panel.nativeElement;
28
- this.singleOptionHeight = this.getSelectItemHeightPx();
29
- this.registerScrollListener();
30
- }
31
- });
32
- }
33
- ngOnDestroy() {
34
- this.destroyed$.next(true);
35
- this.destroyed$.complete();
36
- }
37
- evaluateThreshold() {
38
- if (this.threshold.lastIndexOf('%') > -1) {
39
- this.thrPx = 0;
40
- this.thrPc = (parseFloat(this.threshold) / 100);
41
- }
42
- else {
43
- this.thrPx = parseFloat(this.threshold);
44
- this.thrPc = 0;
45
- }
46
- }
47
- registerScrollListener() {
48
- fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
49
- this.handleScrollEvent(event);
50
- })).subscribe();
51
- }
52
- handleScrollEvent(event) {
53
- this.ngZone.runOutsideAngular(() => {
54
- if (this.complete) {
55
- return;
56
- }
57
- const countOfRenderedOptions = this.matSelect.options.length;
58
- const infiniteScrollDistance = this.singleOptionHeight * countOfRenderedOptions;
59
- const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
60
- const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
61
- if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
62
- this.ngZone.run(() => { this.infiniteScroll.emit(); });
63
- }
64
- });
65
- }
66
- getSelectItemHeightPx() {
67
- return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
68
- }
69
- }
70
- MatSelectInfiniteScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1.MatSelect }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
71
- MatSelectInfiniteScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.3", type: MatSelectInfiniteScrollDirective, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete" }, outputs: { infiniteScroll: "infiniteScroll" }, ngImport: i0 });
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
73
- type: Directive,
74
- args: [{
75
- selector: '[msInfiniteScroll]'
76
- }]
77
- }], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: i0.NgZone }]; }, propDecorators: { threshold: [{
78
- type: Input
79
- }], debounceTime: [{
80
- type: Input
81
- }], complete: [{
82
- type: Input
83
- }], infiniteScroll: [{
84
- type: Output
85
- }] } });
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5wdXRzL3NyYy9zZWxlY3QtYm94L21hdC1zZWxlY3QtaW5maW5pdGUtc2Nyb2xsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2hILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTs7O0FBRXpDLG9EQUFvRDtBQUNwRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQTtBQUsvQixNQUFNLE9BQU8sZ0NBQWdDO0lBYTNDLFlBQThCLFNBQW9CLEVBQW1CLE1BQWM7UUFBckQsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUFtQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBWjFFLGNBQVMsR0FBRyxLQUFLLENBQUE7UUFDakIsaUJBQVksR0FBRyxHQUFHLENBQUE7UUFFakIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFBO1FBRzNDLFVBQUssR0FBRyxDQUFDLENBQUE7UUFDVCxVQUFLLEdBQUcsQ0FBQyxDQUFBO1FBQ1QsdUJBQWtCLEdBQUcscUJBQXFCLENBQUE7UUFFakMsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUE7SUFHcEQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxD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QztrQkFINUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO2lCQUMvQjtxSEFFVSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnXHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcydcclxuXHJcbi8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QgaXRlbXMgaW4gYGVtYCB1bml0cy4gKi9cclxuY29uc3QgU0VMRUNUX0lURU1fSEVJR0hUX0VNID0gM1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbXNJbmZpbml0ZVNjcm9sbF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSB0aHJlc2hvbGQgPSAnMTUlJ1xyXG4gIEBJbnB1dCgpIGRlYm91bmNlVGltZSA9IDE1MFxyXG4gIEBJbnB1dCgpIGNvbXBsZXRlITogYm9vbGVhblxyXG4gIEBPdXRwdXQoKSBpbmZpbml0ZVNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxyXG5cclxuICBwcml2YXRlIHBhbmVsITogRWxlbWVudFxyXG4gIHByaXZhdGUgdGhyUHggPSAwXHJcbiAgcHJpdmF0ZSB0aHJQYyA9IDBcclxuICBwcml2YXRlIHNpbmdsZU9wdGlvbkhlaWdodCA9IFNFTEVDVF9JVEVNX0hFSUdIVF9FTVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpXHJcblxyXG4gIGNvbnN0cnVjdG9yIChwcml2YXRlIHJlYWRvbmx5IG1hdFNlbGVjdDogTWF0U2VsZWN0LCBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCAoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV2YWx1YXRlVGhyZXNob2xkKClcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCAoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hdFNlbGVjdC5vcGVuZWRDaGFuZ2UucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcclxuICAgICkuc3Vic2NyaWJlKChvcGVuZWQpID0+IHtcclxuICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgIHRoaXMucGFuZWwgPSB0aGlzLm1hdFNlbGVjdC5wYW5lbC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgdGhpcy5zaW5nbGVPcHRpb25IZWlnaHQgPSB0aGlzLmdldFNlbGVjdEl0ZW1IZWlnaHRQeCgpXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlclNjcm9sbExpc3RlbmVyKClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95ICgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KHRydWUpXHJcbiAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKVxyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVUaHJlc2hvbGQgKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGhyZXNob2xkLmxhc3RJbmRleE9mKCclJykgPiAtMSkge1xyXG4gICAgICB0aGlzLnRoclB4ID0gMFxyXG4gICAgICB0aGlzLnRoclBjID0gKHBhcnNlRmxvYXQodGhpcy50aHJlc2hvbGQpIC8gMTAwKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50aHJQeCA9IHBhcnNlRmxvYXQodGhpcy50aHJlc2hvbGQpXHJcbiAgICAgIHRoaXMudGhyUGMgPSAwXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3RlclNjcm9sbExpc3RlbmVyICgpOiB2b2lkIHtcclxuICAgIGZyb21FdmVudCh0aGlzLnBhbmVsLCAnc2Nyb2xsJykucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCksXHJcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSksXHJcbiAgICAgIHRhcCgoZXZlbnQpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbEV2ZW50KGV2ZW50KVxyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2Nyb2xsRXZlbnQgKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuY29tcGxldGUpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjb3VudE9mUmVuZGVyZWRPcHRpb25zID0gdGhpcy5tYXRTZWxlY3Qub3B0aW9ucy5sZW5ndGhcclxuICAgICAgY29uc3QgaW5maW5pdGVTY3JvbGxEaXN0YW5jZSA9IHRoaXMuc2luZ2xlT3B0aW9uSGVpZ2h0ICogY291bnRPZlJlbmRlcmVkT3B0aW9uc1xyXG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLnRoclBjICE9PSAwID8gKGluZmluaXRlU2Nyb2xsRGlzdGFuY2UgKiB0aGlzLnRoclBjKSA6IHRoaXMudGhyUHhcclxuXHJcbiAgICAgIGNvbnN0IHNjcm9sbGVkRGlzdGFuY2UgPSB0aGlzLnBhbmVsLmNsaWVudEhlaWdodCArIGV2ZW50LnRhcmdldC5zY3JvbGxUb3BcclxuXHJcbiAgICAgIGlmICgoc2Nyb2xsZWREaXN0YW5jZSArIHRocmVzaG9sZCkgPj0gaW5maW5pdGVTY3JvbGxEaXN0YW5jZSkge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7IHRoaXMuaW5maW5pdGVTY3JvbGwuZW1pdCgpIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RJdGVtSGVpZ2h0UHggKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMucGFuZWwpLmZvbnRTaXplKSAqIFNFTEVDVF9JVEVNX0hFSUdIVF9FTVxyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { Directive, EventEmitter, Input, NgZone, Output } from '@angular/core';
2
+ import { MatSelect } from '@angular/material/select';
3
+ import { debounceTime, takeUntil, tap } from 'rxjs/operators';
4
+ import { fromEvent, Subject } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/material/select";
7
+ /** The height of the select items in `em` units. */
8
+ const SELECT_ITEM_HEIGHT_EM = 3;
9
+ class MatSelectInfiniteScrollDirective {
10
+ matSelect;
11
+ ngZone;
12
+ threshold = '15%';
13
+ debounceTime = 150;
14
+ complete;
15
+ infiniteScroll = new EventEmitter();
16
+ panel;
17
+ thrPx = 0;
18
+ thrPc = 0;
19
+ singleOptionHeight = SELECT_ITEM_HEIGHT_EM;
20
+ destroyed$ = new Subject();
21
+ constructor(matSelect, ngZone) {
22
+ this.matSelect = matSelect;
23
+ this.ngZone = ngZone;
24
+ }
25
+ ngOnInit() {
26
+ this.evaluateThreshold();
27
+ }
28
+ ngAfterViewInit() {
29
+ this.matSelect.openedChange.pipe(takeUntil(this.destroyed$)).subscribe((opened) => {
30
+ if (opened) {
31
+ this.panel = this.matSelect.panel.nativeElement;
32
+ this.singleOptionHeight = this.getSelectItemHeightPx();
33
+ this.registerScrollListener();
34
+ }
35
+ });
36
+ }
37
+ ngOnDestroy() {
38
+ this.destroyed$.next(true);
39
+ this.destroyed$.complete();
40
+ }
41
+ evaluateThreshold() {
42
+ if (this.threshold.lastIndexOf('%') > -1) {
43
+ this.thrPx = 0;
44
+ this.thrPc = (parseFloat(this.threshold) / 100);
45
+ }
46
+ else {
47
+ this.thrPx = parseFloat(this.threshold);
48
+ this.thrPc = 0;
49
+ }
50
+ }
51
+ registerScrollListener() {
52
+ fromEvent(this.panel, 'scroll').pipe(takeUntil(this.destroyed$), debounceTime(this.debounceTime), tap((event) => {
53
+ this.handleScrollEvent(event);
54
+ })).subscribe();
55
+ }
56
+ handleScrollEvent(event) {
57
+ this.ngZone.runOutsideAngular(() => {
58
+ if (this.complete) {
59
+ return;
60
+ }
61
+ const countOfRenderedOptions = this.matSelect.options.length;
62
+ const infiniteScrollDistance = this.singleOptionHeight * countOfRenderedOptions;
63
+ const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;
64
+ const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;
65
+ if ((scrolledDistance + threshold) >= infiniteScrollDistance) {
66
+ this.ngZone.run(() => { this.infiniteScroll.emit(); });
67
+ }
68
+ });
69
+ }
70
+ getSelectItemHeightPx() {
71
+ return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;
72
+ }
73
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: MatSelectInfiniteScrollDirective, deps: [{ token: i1.MatSelect }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
74
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.2", type: MatSelectInfiniteScrollDirective, selector: "[msInfiniteScroll]", inputs: { threshold: "threshold", debounceTime: "debounceTime", complete: "complete" }, outputs: { infiniteScroll: "infiniteScroll" }, ngImport: i0 });
75
+ }
76
+ export { MatSelectInfiniteScrollDirective };
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: MatSelectInfiniteScrollDirective, decorators: [{
78
+ type: Directive,
79
+ args: [{
80
+ selector: '[msInfiniteScroll]'
81
+ }]
82
+ }], ctorParameters: function () { return [{ type: i1.MatSelect }, { type: i0.NgZone }]; }, propDecorators: { threshold: [{
83
+ type: Input
84
+ }], debounceTime: [{
85
+ type: Input
86
+ }], complete: [{
87
+ type: Input
88
+ }], infiniteScroll: [{
89
+ type: Output
90
+ }] } });
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LXNlbGVjdC1pbmZpbml0ZS1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaW5wdXRzL3NyYy9zZWxlY3QtYm94L21hdC1zZWxlY3QtaW5maW5pdGUtc2Nyb2xsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2hILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTs7O0FBRXpDLG9EQUFvRDtBQUNwRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQTtBQUUvQixNQUdhLGdDQUFnQztJQWFiO0lBQXVDO0lBWjVELFNBQVMsR0FBRyxLQUFLLENBQUE7SUFDakIsWUFBWSxHQUFHLEdBQUcsQ0FBQTtJQUNsQixRQUFRLENBQVU7SUFDakIsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUE7SUFFM0MsS0FBSyxDQUFVO0lBQ2YsS0FBSyxHQUFHLENBQUMsQ0FBQTtJQUNULEtBQUssR0FBRyxDQUFDLENBQUE7SUFDVCxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQTtJQUVqQyxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQTtJQUVwRCxZQUE4QixTQUFvQixFQUFtQixNQUFjO1FBQXJELGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBbUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUNuRixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFFRCxl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LGdDQUFnQzsyRkFBaEMsZ0NBQWdDOztTQUFoQyxnQ0FBZ0M7MkZBQWhDLGdDQUFnQztrQkFINUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO2lCQUMvQjtxSEFFVSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnXHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcydcclxuXHJcbi8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QgaXRlbXMgaW4gYGVtYCB1bml0cy4gKi9cclxuY29uc3QgU0VMRUNUX0lURU1fSEVJR0hUX0VNID0gM1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbXNJbmZpbml0ZVNjcm9sbF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRTZWxlY3RJbmZpbml0ZVNjcm9sbERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSB0aHJlc2hvbGQgPSAnMTUlJ1xyXG4gIEBJbnB1dCgpIGRlYm91bmNlVGltZSA9IDE1MFxyXG4gIEBJbnB1dCgpIGNvbXBsZXRlITogYm9vbGVhblxyXG4gIEBPdXRwdXQoKSBpbmZpbml0ZVNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxyXG5cclxuICBwcml2YXRlIHBhbmVsITogRWxlbWVudFxyXG4gIHByaXZhdGUgdGhyUHggPSAwXHJcbiAgcHJpdmF0ZSB0aHJQYyA9IDBcclxuICBwcml2YXRlIHNpbmdsZU9wdGlvbkhlaWdodCA9IFNFTEVDVF9JVEVNX0hFSUdIVF9FTVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpXHJcblxyXG4gIGNvbnN0cnVjdG9yIChwcml2YXRlIHJlYWRvbmx5IG1hdFNlbGVjdDogTWF0U2VsZWN0LCBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCAoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV2YWx1YXRlVGhyZXNob2xkKClcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCAoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hdFNlbGVjdC5vcGVuZWRDaGFuZ2UucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcclxuICAgICkuc3Vic2NyaWJlKChvcGVuZWQpID0+IHtcclxuICAgICAgaWYgKG9wZW5lZCkge1xyXG4gICAgICAgIHRoaXMucGFuZWwgPSB0aGlzLm1hdFNlbGVjdC5wYW5lbC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgdGhpcy5zaW5nbGVPcHRpb25IZWlnaHQgPSB0aGlzLmdldFNlbGVjdEl0ZW1IZWlnaHRQeCgpXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlclNjcm9sbExpc3RlbmVyKClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95ICgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KHRydWUpXHJcbiAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKVxyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVUaHJlc2hvbGQgKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGhyZXNob2xkLmxhc3RJbmRleE9mKCclJykgPiAtMSkge1xyXG4gICAgICB0aGlzLnRoclB4ID0gMFxyXG4gICAgICB0aGlzLnRoclBjID0gKHBhcnNlRmxvYXQodGhpcy50aHJlc2hvbGQpIC8gMTAwKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50aHJQeCA9IHBhcnNlRmxvYXQodGhpcy50aHJlc2hvbGQpXHJcbiAgICAgIHRoaXMudGhyUGMgPSAwXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3RlclNjcm9sbExpc3RlbmVyICgpOiB2b2lkIHtcclxuICAgIGZyb21FdmVudCh0aGlzLnBhbmVsLCAnc2Nyb2xsJykucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCksXHJcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSksXHJcbiAgICAgIHRhcCgoZXZlbnQpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbEV2ZW50KGV2ZW50KVxyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2Nyb2xsRXZlbnQgKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuY29tcGxldGUpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBjb3VudE9mUmVuZGVyZWRPcHRpb25zID0gdGhpcy5tYXRTZWxlY3Qub3B0aW9ucy5sZW5ndGhcclxuICAgICAgY29uc3QgaW5maW5pdGVTY3JvbGxEaXN0YW5jZSA9IHRoaXMuc2luZ2xlT3B0aW9uSGVpZ2h0ICogY291bnRPZlJlbmRlcmVkT3B0aW9uc1xyXG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLnRoclBjICE9PSAwID8gKGluZmluaXRlU2Nyb2xsRGlzdGFuY2UgKiB0aGlzLnRoclBjKSA6IHRoaXMudGhyUHhcclxuXHJcbiAgICAgIGNvbnN0IHNjcm9sbGVkRGlzdGFuY2UgPSB0aGlzLnBhbmVsLmNsaWVudEhlaWdodCArIGV2ZW50LnRhcmdldC5zY3JvbGxUb3BcclxuXHJcbiAgICAgIGlmICgoc2Nyb2xsZWREaXN0YW5jZSArIHRocmVzaG9sZCkgPj0gaW5maW5pdGVTY3JvbGxEaXN0YW5jZSkge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7IHRoaXMuaW5maW5pdGVTY3JvbGwuZW1pdCgpIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RJdGVtSGVpZ2h0UHggKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMucGFuZWwpLmZvbnRTaXplKSAqIFNFTEVDVF9JVEVNX0hFSUdIVF9FTVxyXG4gIH1cclxufVxyXG4iXX0=