@3kles/kles-material-dynamicforms 14.10.1 → 16.0.2

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 (112) hide show
  1. package/{esm2020 → esm2022}/lib/directive/dynamic-component.directive.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/directive/dynamic-field.directive.mjs +4 -4
  3. package/esm2022/lib/dynamic-form.component.mjs +188 -0
  4. package/{esm2020 → esm2022}/lib/fields/array.component.mjs +6 -6
  5. package/{esm2020 → esm2022}/lib/fields/badge.component.mjs +6 -6
  6. package/{esm2020 → esm2022}/lib/fields/button-form.component.mjs +6 -6
  7. package/{esm2020 → esm2022}/lib/fields/button-submit.component.mjs +6 -6
  8. package/{esm2020 → esm2022}/lib/fields/button-toogle-group.component.mjs +6 -6
  9. package/{esm2020 → esm2022}/lib/fields/buttonchecker-form.component.mjs +6 -6
  10. package/{esm2020 → esm2022}/lib/fields/buttonfile-form.component.mjs +6 -6
  11. package/{esm2020 → esm2022}/lib/fields/checkbox.component.mjs +6 -6
  12. package/{esm2020 → esm2022}/lib/fields/chip.component.mjs +14 -14
  13. package/esm2022/lib/fields/clear.component.mjs +30 -0
  14. package/{esm2020 → esm2022}/lib/fields/color.component.mjs +10 -10
  15. package/{esm2020 → esm2022}/lib/fields/date-time.component.mjs +8 -8
  16. package/{esm2020 → esm2022}/lib/fields/date.component.mjs +8 -8
  17. package/{esm2020 → esm2022}/lib/fields/field.abstract.mjs +4 -4
  18. package/{esm2020 → esm2022}/lib/fields/group.component.mjs +6 -6
  19. package/{esm2020 → esm2022}/lib/fields/icon.component.mjs +6 -6
  20. package/{esm2020 → esm2022}/lib/fields/input.clearable.component.mjs +10 -10
  21. package/esm2022/lib/fields/input.component.mjs +169 -0
  22. package/{esm2020 → esm2022}/lib/fields/label.component.mjs +6 -6
  23. package/esm2022/lib/fields/line-break.component.mjs +23 -0
  24. package/{esm2020 → esm2022}/lib/fields/link.component.mjs +6 -6
  25. package/esm2022/lib/fields/list-field.component.mjs +122 -0
  26. package/{esm2020 → esm2022}/lib/fields/radio.component.mjs +6 -6
  27. package/{esm2020 → esm2022}/lib/fields/range.component.mjs +6 -6
  28. package/esm2022/lib/fields/select.component.mjs +315 -0
  29. package/esm2022/lib/fields/select.lazy-search.component.mjs +278 -0
  30. package/esm2022/lib/fields/select.search.component.mjs +396 -0
  31. package/{esm2020 → esm2022}/lib/fields/selection-list.component.mjs +6 -6
  32. package/{esm2020 → esm2022}/lib/fields/slide-toggle.component.mjs +6 -6
  33. package/{esm2020 → esm2022}/lib/fields/text.component.mjs +6 -6
  34. package/{esm2020 → esm2022}/lib/fields/textarea.component.mjs +10 -10
  35. package/{esm2020 → esm2022}/lib/forms/button-control.component.mjs +12 -12
  36. package/{esm2020 → esm2022}/lib/forms/buttonchecker-control.component.mjs +12 -12
  37. package/{esm2020 → esm2022}/lib/forms/buttonfile-control.component.mjs +12 -12
  38. package/{esm2020 → esm2022}/lib/kles-material-dynamicforms.module.mjs +97 -97
  39. package/{esm2020 → esm2022}/lib/matcher/form-error.matcher.mjs +4 -4
  40. package/esm2022/lib/modules/material.module.mjs +279 -0
  41. package/{esm2020 → esm2022}/lib/pipe/array.pipe.mjs +4 -4
  42. package/{esm2020 → esm2022}/lib/pipe/transform.pipe.mjs +4 -4
  43. package/{fesm2020 → fesm2022}/3kles-kles-material-dynamicforms.mjs +562 -565
  44. package/fesm2022/3kles-kles-material-dynamicforms.mjs.map +1 -0
  45. package/lib/directive/dynamic-component.directive.d.ts +1 -1
  46. package/lib/directive/dynamic-field.directive.d.ts +1 -1
  47. package/lib/dynamic-form.component.d.ts +1 -1
  48. package/lib/fields/array.component.d.ts +1 -1
  49. package/lib/fields/badge.component.d.ts +1 -1
  50. package/lib/fields/button-form.component.d.ts +1 -1
  51. package/lib/fields/button-submit.component.d.ts +1 -1
  52. package/lib/fields/button-toogle-group.component.d.ts +1 -1
  53. package/lib/fields/buttonchecker-form.component.d.ts +1 -1
  54. package/lib/fields/buttonfile-form.component.d.ts +1 -1
  55. package/lib/fields/checkbox.component.d.ts +1 -1
  56. package/lib/fields/chip.component.d.ts +1 -1
  57. package/lib/fields/clear.component.d.ts +1 -1
  58. package/lib/fields/color.component.d.ts +1 -1
  59. package/lib/fields/date-time.component.d.ts +1 -1
  60. package/lib/fields/date.component.d.ts +1 -1
  61. package/lib/fields/field.abstract.d.ts +1 -1
  62. package/lib/fields/group.component.d.ts +1 -1
  63. package/lib/fields/icon.component.d.ts +1 -1
  64. package/lib/fields/input.clearable.component.d.ts +1 -1
  65. package/lib/fields/input.component.d.ts +1 -1
  66. package/lib/fields/label.component.d.ts +1 -1
  67. package/lib/fields/line-break.component.d.ts +1 -1
  68. package/lib/fields/link.component.d.ts +1 -1
  69. package/lib/fields/list-field.component.d.ts +1 -1
  70. package/lib/fields/radio.component.d.ts +1 -1
  71. package/lib/fields/range.component.d.ts +1 -1
  72. package/lib/fields/select.component.d.ts +1 -1
  73. package/lib/fields/select.lazy-search.component.d.ts +1 -1
  74. package/lib/fields/select.search.component.d.ts +1 -1
  75. package/lib/fields/selection-list.component.d.ts +1 -1
  76. package/lib/fields/slide-toggle.component.d.ts +1 -1
  77. package/lib/fields/text.component.d.ts +1 -1
  78. package/lib/fields/textarea.component.d.ts +1 -1
  79. package/lib/forms/button-control.component.d.ts +1 -1
  80. package/lib/forms/buttonchecker-control.component.d.ts +1 -1
  81. package/lib/forms/buttonfile-control.component.d.ts +1 -1
  82. package/lib/modules/material.module.d.ts +1 -1
  83. package/package.json +19 -26
  84. package/esm2020/lib/dynamic-form.component.mjs +0 -188
  85. package/esm2020/lib/fields/clear.component.mjs +0 -31
  86. package/esm2020/lib/fields/input.component.mjs +0 -169
  87. package/esm2020/lib/fields/line-break.component.mjs +0 -23
  88. package/esm2020/lib/fields/list-field.component.mjs +0 -114
  89. package/esm2020/lib/fields/select.component.mjs +0 -315
  90. package/esm2020/lib/fields/select.lazy-search.component.mjs +0 -278
  91. package/esm2020/lib/fields/select.search.component.mjs +0 -396
  92. package/esm2020/lib/modules/material.module.mjs +0 -285
  93. package/fesm2015/3kles-kles-material-dynamicforms.mjs +0 -3687
  94. package/fesm2015/3kles-kles-material-dynamicforms.mjs.map +0 -1
  95. package/fesm2020/3kles-kles-material-dynamicforms.mjs.map +0 -1
  96. /package/{esm2020 → esm2022}/3kles-kles-material-dynamicforms.mjs +0 -0
  97. /package/{esm2020 → esm2022}/lib/controls/array.control.mjs +0 -0
  98. /package/{esm2020 → esm2022}/lib/controls/control.interface.mjs +0 -0
  99. /package/{esm2020 → esm2022}/lib/controls/default.control.mjs +0 -0
  100. /package/{esm2020 → esm2022}/lib/controls/group.control.mjs +0 -0
  101. /package/{esm2020 → esm2022}/lib/controls/range.control.mjs +0 -0
  102. /package/{esm2020 → esm2022}/lib/decorators/component.decorator.mjs +0 -0
  103. /package/{esm2020 → esm2022}/lib/enums/type.enum.mjs +0 -0
  104. /package/{esm2020 → esm2022}/lib/factories/field.factory.mjs +0 -0
  105. /package/{esm2020 → esm2022}/lib/interfaces/clear-control.interface.mjs +0 -0
  106. /package/{esm2020 → esm2022}/lib/interfaces/component.interface.mjs +0 -0
  107. /package/{esm2020 → esm2022}/lib/interfaces/directive.interface.mjs +0 -0
  108. /package/{esm2020 → esm2022}/lib/interfaces/field.config.interface.mjs +0 -0
  109. /package/{esm2020 → esm2022}/lib/interfaces/field.interface.mjs +0 -0
  110. /package/{esm2020 → esm2022}/lib/interfaces/validator.interface.mjs +0 -0
  111. /package/{esm2020 → esm2022}/lib/validators/autocomplete.validator.mjs +0 -0
  112. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -0,0 +1,315 @@
1
+ import { __decorate } from "tslib";
2
+ import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
3
+ import { Component, ViewChild, ViewChildren } from '@angular/core';
4
+ import { MatOption } from '@angular/material/core';
5
+ import { BehaviorSubject, Observable, of, Subject } from 'rxjs';
6
+ import { switchMap, take, takeUntil } from 'rxjs/operators';
7
+ import { FieldMapper } from '../decorators/component.decorator';
8
+ import { EnumType } from '../enums/type.enum';
9
+ import { KlesFieldAbstract } from './field.abstract';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "@angular/forms";
13
+ import * as i3 from "@angular/flex-layout/flex";
14
+ import * as i4 from "@angular/flex-layout/extended";
15
+ import * as i5 from "@angular/material/form-field";
16
+ import * as i6 from "@angular/material/select";
17
+ import * as i7 from "@angular/material/core";
18
+ import * as i8 from "@angular/material/tooltip";
19
+ import * as i9 from "@angular/material/progress-spinner";
20
+ import * as i10 from "@angular/cdk/scrolling";
21
+ import * as i11 from "../directive/dynamic-component.directive";
22
+ import * as i12 from "@ngx-translate/core";
23
+ import * as i13 from "../pipe/transform.pipe";
24
+ let KlesFormSelectComponent = class KlesFormSelectComponent extends KlesFieldAbstract {
25
+ constructor(viewRef, ref) {
26
+ super(viewRef);
27
+ this.viewRef = viewRef;
28
+ this.ref = ref;
29
+ this.isLoading = false;
30
+ this.openChange$ = new Subject();
31
+ this.compareFn = (o1, o2) => {
32
+ if (this.field.property && o1 && o2) {
33
+ return o1[this.field.property] === o2[this.field.property];
34
+ }
35
+ return o1 === o2;
36
+ };
37
+ }
38
+ ngOnInit() {
39
+ super.ngOnInit();
40
+ if (this.field.lazy) {
41
+ this.isLoading = true;
42
+ if (this.group.controls[this.field.name].value !== undefined && this.group.controls[this.field.name].value !== null) {
43
+ this.options$ = new BehaviorSubject(Array.isArray(this.group.controls[this.field.name].value) ? this.group.controls[this.field.name].value
44
+ : [this.group.controls[this.field.name].value]);
45
+ this.isLoading = false;
46
+ }
47
+ else {
48
+ this.options$ = new BehaviorSubject([]);
49
+ }
50
+ this.openChange$
51
+ .pipe(takeUntil(this._onDestroy), switchMap((isOpen) => {
52
+ if (isOpen) {
53
+ if (this.field.options instanceof Observable) {
54
+ this.isLoading = true;
55
+ return this.field.options.pipe(take(1));
56
+ }
57
+ else if (this.field.options instanceof Function) {
58
+ this.isLoading = true;
59
+ return this.field.options();
60
+ }
61
+ else {
62
+ return of(this.field.options);
63
+ }
64
+ }
65
+ else {
66
+ return of(this.group.controls[this.field.name].value !== undefined && this.group.controls[this.field.name].value !== null
67
+ ? (Array.isArray(this.group.controls[this.field.name].value) ?
68
+ this.group.controls[this.field.name].value : [this.group.controls[this.field.name].value]) : []);
69
+ }
70
+ }))
71
+ .subscribe((options) => {
72
+ this.options$.next(options);
73
+ this.isLoading = false;
74
+ this.ref.markForCheck();
75
+ });
76
+ }
77
+ else {
78
+ if (this.field.options instanceof Observable) {
79
+ this.options$ = this.field.options;
80
+ }
81
+ else if (this.field.options instanceof Function) {
82
+ this.options$ = this.field.options();
83
+ }
84
+ else {
85
+ this.options$ = of(this.field.options);
86
+ }
87
+ }
88
+ }
89
+ ngOnDestroy() {
90
+ super.ngOnDestroy();
91
+ }
92
+ openChange($event) {
93
+ if (this.field.lazy) {
94
+ this.openChange$.next($event);
95
+ // if ($event) {
96
+ // if (!(this.field.options instanceof Observable)) {
97
+ // (this.options$ as BehaviorSubject<any[]>).next(this.field.options);
98
+ // } else {
99
+ // this.isLoading = true;
100
+ // this.field.options.pipe(take(1)).subscribe(options => {
101
+ // (this.options$ as BehaviorSubject<any[]>).next(options);
102
+ // this.isLoading = false;
103
+ // this.ref.markForCheck();
104
+ // });
105
+ // }
106
+ // } else {
107
+ // (this.options$ as BehaviorSubject<any[]>)
108
+ // .next(this.group.controls[this.field.name].value !== undefined ? [this.group.controls[this.field.name].value] : []);
109
+ // this.ref.markForCheck();
110
+ // // this.isLoading = true;
111
+ // }
112
+ }
113
+ if (this.field.virtualScroll) {
114
+ if ($event) {
115
+ this.cdkVirtualScrollViewport.scrollToIndex(0);
116
+ this.cdkVirtualScrollViewport.checkViewportSize();
117
+ }
118
+ }
119
+ }
120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: KlesFormSelectComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: KlesFormSelectComponent, selector: "kles-form-select", viewQueries: [{ propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "options", predicate: MatOption, descendants: true }], usesInheritance: true, ngImport: i0, template: `
122
+ <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
123
+ <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id"
124
+ (openedChange)="openChange($event)" [compareWith]="compareFn"
125
+ [ngClass]="field.ngClass" [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
126
+ <mat-select-trigger *ngIf="field.triggerComponent">
127
+ <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
128
+ </mat-select-trigger>
129
+
130
+ <ng-container *ngIf="!field.virtualScroll">
131
+ <ng-container *ngIf="!field.autocompleteComponent">
132
+ <ng-container *ngIf="!isLoading; else emptyOption">
133
+ <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
134
+ </ng-container>
135
+ </ng-container>
136
+
137
+ <ng-container *ngIf="field.autocompleteComponent">
138
+ <ng-container *ngIf="!isLoading; else emptyOption">
139
+ <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
140
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
141
+ </mat-option>
142
+ </ng-container>
143
+ </ng-container>
144
+ <ng-template #emptyOption>
145
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
146
+ </ng-template>
147
+ </ng-container>
148
+
149
+ <ng-container *ngIf="field.virtualScroll">
150
+ <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=5*48>
151
+ <ng-container *ngIf="!field.autocompleteComponent">
152
+ <ng-container *ngIf="!isLoading; else emptyOption">
153
+ <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
154
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
155
+ </mat-option>
156
+ </ng-container>
157
+
158
+ <ng-container *ngIf="field.multiple">
159
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
160
+ style="display:none">
161
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
162
+ </mat-option>
163
+ </ng-container>
164
+
165
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
166
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
167
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
168
+ </mat-option>
169
+ </ng-container>
170
+ </ng-container>
171
+
172
+ <ng-container *ngIf="field.autocompleteComponent">
173
+ <ng-container *ngIf="!isLoading; else emptyOption">
174
+ <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
175
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
176
+ </mat-option>
177
+ </ng-container>
178
+ <ng-container *ngIf="field.multiple">
179
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
180
+ style="display:none">
181
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
182
+ </mat-option>
183
+ </ng-container>
184
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
185
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
186
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
187
+ </mat-option>
188
+ </ng-container>
189
+ </ng-container>
190
+
191
+ <ng-template #emptyOption>
192
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
193
+ </ng-template>
194
+ </cdk-virtual-scroll-viewport>
195
+
196
+ </ng-container>
197
+
198
+ </mat-select>
199
+
200
+ <div matSuffix *ngIf="field.subComponents || field.clearable">
201
+ <ng-content></ng-content>
202
+ </div>
203
+ <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
204
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
205
+ </ng-container>
206
+ <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
207
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
208
+ </ng-container>
209
+ </mat-form-field>
210
+ `, isInline: true, styles: ["mat-form-field{width:100%}\n", "::ng-deep .hide-checkbox .mat-pseudo-checkbox{display:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i6.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i10.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i10.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i10.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i11.KlesComponentDirective, selector: "[klesComponent]", inputs: ["component", "value", "field"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.KlesTransformPipe, name: "klesTransform" }] }); }
211
+ };
212
+ KlesFormSelectComponent = __decorate([
213
+ FieldMapper({ type: EnumType.select })
214
+ ], KlesFormSelectComponent);
215
+ export { KlesFormSelectComponent };
216
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: KlesFormSelectComponent, decorators: [{
217
+ type: Component,
218
+ args: [{ selector: 'kles-form-select', template: `
219
+ <mat-form-field class="margin-top" [color]="field.color" [formGroup]="group">
220
+ <mat-select matTooltip="{{field.tooltip}}" [attr.id]="field.id"
221
+ (openedChange)="openChange($event)" [compareWith]="compareFn"
222
+ [ngClass]="field.ngClass" [placeholder]="field.placeholder | translate" [formControlName]="field.name" [multiple]="field.multiple">
223
+ <mat-select-trigger *ngIf="field.triggerComponent">
224
+ <ng-container klesComponent [component]="field.triggerComponent" [value]="group.controls[field.name].value" [field]="field"></ng-container>
225
+ </mat-select-trigger>
226
+
227
+ <ng-container *ngIf="!field.virtualScroll">
228
+ <ng-container *ngIf="!field.autocompleteComponent">
229
+ <ng-container *ngIf="!isLoading; else emptyOption">
230
+ <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">{{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}</mat-option>
231
+ </ng-container>
232
+ </ng-container>
233
+
234
+ <ng-container *ngIf="field.autocompleteComponent">
235
+ <ng-container *ngIf="!isLoading; else emptyOption">
236
+ <mat-option *ngFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
237
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
238
+ </mat-option>
239
+ </ng-container>
240
+ </ng-container>
241
+ <ng-template #emptyOption>
242
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
243
+ </ng-template>
244
+ </ng-container>
245
+
246
+ <ng-container *ngIf="field.virtualScroll">
247
+ <cdk-virtual-scroll-viewport [itemSize]="field.itemSize || 50" [style.height.px]=5*48>
248
+ <ng-container *ngIf="!field.autocompleteComponent">
249
+ <ng-container *ngIf="!isLoading; else emptyOption">
250
+ <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
251
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
252
+ </mat-option>
253
+ </ng-container>
254
+
255
+ <ng-container *ngIf="field.multiple">
256
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
257
+ style="display:none">
258
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
259
+ </mat-option>
260
+ </ng-container>
261
+
262
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
263
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
264
+ {{(field.property ? item[field.property] : item) | klesTransform:field.pipeTransform}}
265
+ </mat-option>
266
+ </ng-container>
267
+ </ng-container>
268
+
269
+ <ng-container *ngIf="field.autocompleteComponent">
270
+ <ng-container *ngIf="!isLoading; else emptyOption">
271
+ <mat-option *cdkVirtualFor="let item of options$ | async" [value]="item" [disabled]="item?.disabled">
272
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
273
+ </mat-option>
274
+ </ng-container>
275
+ <ng-container *ngIf="field.multiple">
276
+ <mat-option *ngFor="let item of group.controls[field.name].value | slice:0:30" [value]="item"
277
+ style="display:none">
278
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
279
+ </mat-option>
280
+ </ng-container>
281
+ <ng-container *ngIf="!field.multiple && group.controls[field.name].value">
282
+ <mat-option *ngFor="let item of [group?.controls[field.name]?.value]" [value]="item" style="display:none">
283
+ <ng-container klesComponent [component]="field.autocompleteComponent" [value]="item" [field]="field"></ng-container>
284
+ </mat-option>
285
+ </ng-container>
286
+ </ng-container>
287
+
288
+ <ng-template #emptyOption>
289
+ <mat-option class="hide-checkbox" disabled><div fxLayout="row" fxLayoutAlign="space-between center">{{'loading' | translate}}... <mat-spinner class="spinner" diameter="20"></mat-spinner></div></mat-option>
290
+ </ng-template>
291
+ </cdk-virtual-scroll-viewport>
292
+
293
+ </ng-container>
294
+
295
+ </mat-select>
296
+
297
+ <div matSuffix *ngIf="field.subComponents || field.clearable">
298
+ <ng-content></ng-content>
299
+ </div>
300
+ <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
301
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
302
+ </ng-container>
303
+ <ng-container *ngFor="let validation of field.asyncValidations;" ngProjectAs="mat-error">
304
+ <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message | translate}}</mat-error>
305
+ </ng-container>
306
+ </mat-form-field>
307
+ `, styles: ["mat-form-field{width:100%}\n", "::ng-deep .hide-checkbox .mat-pseudo-checkbox{display:none!important}\n"] }]
308
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { cdkVirtualScrollViewport: [{
309
+ type: ViewChild,
310
+ args: [CdkVirtualScrollViewport]
311
+ }], options: [{
312
+ type: ViewChildren,
313
+ args: [MatOption]
314
+ }] } });
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tsZXMtbWF0ZXJpYWwtZHluYW1pY2Zvcm1zL3NyYy9saWIvZmllbGRzL3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xFLE9BQU8sRUFBcUIsU0FBUyxFQUFnQyxTQUFTLEVBQUUsWUFBWSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUN0SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFrRzlDLElBQU0sdUJBQXVCLEdBQTdCLE1BQU0sdUJBQXdCLFNBQVEsaUJBQWlCO0lBVzFELFlBQXNCLE9BQXlCLEVBQVksR0FBc0I7UUFDN0UsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBREcsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFBWSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUpqRixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQStGckMsY0FBUyxHQUFHLENBQUMsRUFBTyxFQUFFLEVBQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksSUFBSSxD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dCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdE9wdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaWVsZE1hcHBlciB9IGZyb20gJy4uL2RlY29yYXRvcnMvY29tcG9uZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBFbnVtVHlwZSB9IGZyb20gJy4uL2VudW1zL3R5cGUuZW51bSc7XG5pbXBvcnQgeyBLbGVzRmllbGRBYnN0cmFjdCB9IGZyb20gJy4vZmllbGQuYWJzdHJhY3QnO1xuXG5ARmllbGRNYXBwZXIoeyB0eXBlOiBFbnVtVHlwZS5zZWxlY3QgfSlcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna2xlcy1mb3JtLXNlbGVjdCcsXG4gICAgdGVtcGxhdGU6IGBcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXJnaW4tdG9wXCIgW2NvbG9yXT1cImZpZWxkLmNvbG9yXCIgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxuICAgICAgICA8bWF0LXNlbGVjdCBtYXRUb29sdGlwPVwie3tmaWVsZC50b29sdGlwfX1cIiBbYXR0ci5pZF09XCJmaWVsZC5pZFwiXG4gICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib3BlbkNoYW5nZSgkZXZlbnQpXCIgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVGblwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkLm5nQ2xhc3NcIiBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLm5hbWVcIiBbbXVsdGlwbGVdPVwiZmllbGQubXVsdGlwbGVcIj5cbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlciAqbmdJZj1cImZpZWxkLnRyaWdnZXJDb21wb25lbnRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIga2xlc0NvbXBvbmVudCBbY29tcG9uZW50XT1cImZpZWxkLnRyaWdnZXJDb21wb25lbnRcIiBbdmFsdWVdPVwiZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWVcIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWVsZC52aXJ0dWFsU2Nyb2xsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nOyBlbHNlIGVtcHR5T3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnMkIHwgYXN5bmNcIiBbdmFsdWVdPVwiaXRlbVwiIFtkaXNhYmxlZF09XCJpdGVtPy5kaXNhYmxlZFwiPnt7KGZpZWxkLnByb3BlcnR5ID8gaXRlbVtmaWVsZC5wcm9wZXJ0eV0gOiBpdGVtKSB8IGtsZXNUcmFuc2Zvcm06ZmllbGQucGlwZVRyYW5zZm9ybX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZzsgZWxzZSBlbXB0eU9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9ucyQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtXCIgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCIgW3ZhbHVlXT1cIml0ZW1cIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eU9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cImhpZGUtY2hlY2tib3hcIiBkaXNhYmxlZD48ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWJldHdlZW4gY2VudGVyXCI+e3snbG9hZGluZycgfCB0cmFuc2xhdGV9fS4uLiA8bWF0LXNwaW5uZXIgY2xhc3M9XCJzcGlubmVyXCIgZGlhbWV0ZXI9XCIyMFwiPjwvbWF0LXNwaW5uZXI+PC9kaXY+PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLnZpcnR1YWxTY3JvbGxcIj5cbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgW2l0ZW1TaXplXT1cImZpZWxkLml0ZW1TaXplIHx8IDUwXCIgW3N0eWxlLmhlaWdodC5weF09NSo0OD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZzsgZWxzZSBlbXB0eU9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKmNka1ZpcnR1YWxGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25zJCB8IGFzeW5jXCIgW3ZhbHVlXT1cIml0ZW1cIiAgW2Rpc2FibGVkXT1cIml0ZW0/LmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyhmaWVsZC5wcm9wZXJ0eSA/IGl0ZW1bZmllbGQucHJvcGVydHldIDogaXRlbSkgfCBrbGVzVHJhbnNmb3JtOmZpZWxkLnBpcGVUcmFuc2Zvcm19fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlIHwgc2xpY2U6MDozMFwiIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3soZmllbGQucHJvcGVydHkgPyBpdGVtW2ZpZWxkLnByb3BlcnR5XSA6IGl0ZW0pIHwga2xlc1RyYW5zZm9ybTpmaWVsZC5waXBlVHJhbnNmb3JtfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWVsZC5tdWx0aXBsZSAmJiBncm91cC5jb250cm9sc1tmaWVsZC5uYW1lXS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbZ3JvdXA/LmNvbnRyb2xzW2ZpZWxkLm5hbWVdPy52YWx1ZV1cIiBbdmFsdWVdPVwiaXRlbVwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3soZmllbGQucHJvcGVydHkgPyBpdGVtW2ZpZWxkLnByb3BlcnR5XSA6IGl0ZW0pIHwga2xlc1RyYW5zZm9ybTpmaWVsZC5waXBlVHJhbnNmb3JtfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nOyBlbHNlIGVtcHR5T3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqY2RrVmlydHVhbEZvcj1cImxldCBpdGVtIG9mIG9wdGlvbnMkIHwgYXN5bmNcIiBbdmFsdWVdPVwiaXRlbVwiIFtkaXNhYmxlZF09XCJpdGVtPy5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIga2xlc0NvbXBvbmVudCBbY29tcG9uZW50XT1cImZpZWxkLmF1dG9jb21wbGV0ZUNvbXBvbmVudFwiIFt2YWx1ZV09XCJpdGVtXCIgW2ZpZWxkXT1cImZpZWxkXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQubXVsdGlwbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwLmNvbnRyb2xzW2ZpZWxkLm5hbWVdLnZhbHVlIHwgc2xpY2U6MDozMFwiIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBrbGVzQ29tcG9uZW50IFtjb21wb25lbnRdPVwiZmllbGQuYXV0b2NvbXBsZXRlQ29tcG9uZW50XCIgW3ZhbHVlXT1cIml0ZW1cIiBbZmllbGRdPVwiZmllbGRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmllbGQubXVsdGlwbGUgJiYgZ3JvdXAuY29udHJvbHNbZmllbGQubmFtZV0udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIFtncm91cD8uY29udHJvbHNbZmllbGQubmFtZV0/LnZhbHVlXVwiIFt2YWx1ZV09XCJpdGVtXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGtsZXNDb21wb25lbnQgW2NvbXBvbmVudF09XCJmaWVsZC5hdXRvY29tcGxldGVDb21wb25lbnRcIiBbdmFsdWVdPVwiaXRlbVwiIFtmaWVsZF09XCJmaWVsZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlPcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiaGlkZS1jaGVja2JveFwiIGRpc2FibGVkPjxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlbiBjZW50ZXJcIj57eydsb2FkaW5nJyB8IHRyYW5zbGF0ZX19Li4uIDxtYXQtc3Bpbm5lciBjbGFzcz1cInNwaW5uZXJcIiBkaWFtZXRlcj1cIjIwXCI+PC9tYXQtc3Bpbm5lcj48L2Rpdj48L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICA8ZGl2IG1hdFN1ZmZpeCAqbmdJZj1cImZpZWxkLnN1YkNvbXBvbmVudHMgfHwgZmllbGQuY2xlYXJhYmxlXCI+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWxpZGF0aW9uIG9mIGZpZWxkLnZhbGlkYXRpb25zO1wiIG5nUHJvamVjdEFzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImdyb3VwLmdldChmaWVsZC5uYW1lKS5oYXNFcnJvcih2YWxpZGF0aW9uLm5hbWUpXCI+e3t2YWxpZGF0aW9uLm1lc3NhZ2UgfCB0cmFuc2xhdGV9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWxpZGF0aW9uIG9mIGZpZWxkLmFzeW5jVmFsaWRhdGlvbnM7XCIgbmdQcm9qZWN0QXM9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZ3JvdXAuZ2V0KGZpZWxkLm5hbWUpLmhhc0Vycm9yKHZhbGlkYXRpb24ubmFtZSlcIj57e3ZhbGlkYXRpb24ubWVzc2FnZSB8IHRyYW5zbGF0ZX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuYCxcbiAgICBzdHlsZXM6IFsnbWF0LWZvcm0tZmllbGQge3dpZHRoOiBjYWxjKDEwMCUpfScsXG4gICAgICAgIGA6Om5nLWRlZXAgLmhpZGUtY2hlY2tib3ggLm1hdC1wc2V1ZG8tY2hlY2tib3ggeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7ICB9YF1cbn0pXG5leHBvcnQgY2xhc3MgS2xlc0Zvcm1TZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBLbGVzRmllbGRBYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSBjZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICBAVmlld0NoaWxkcmVuKE1hdE9wdGlvbikgb3B0aW9uczogUXVlcnlMaXN0PE1hdE9wdGlvbj47XG5cbiAgICBvcHRpb25zJDogT2JzZXJ2YWJsZTxhbnlbXT47XG5cbiAgICBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICAgIG9wZW5DaGFuZ2UkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmLCBwcm90ZWN0ZWQgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgICBzdXBlcih2aWV3UmVmKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuZmllbGQubGF6eSkge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihBcnJheS5pc0FycmF5KHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS52YWx1ZSkgPyB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGQubmFtZV0udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBbdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLmZpZWxkLm5hbWVdLnZhbHVlXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlJFxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSxcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChpc09wZW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWVsZC5vcHRpb25zIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpZWxkLm9wdGlvbnMucGlwZSh0YWtlKDEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5maWVsZC5vcHRpb25zIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZC5vcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5maWVsZC5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGQubmFtZV0udmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGQubmFtZV0udmFsdWUgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoQXJyYXkuaXNBcnJheSh0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGQubmFtZV0udmFsdWUpID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS52YWx1ZSA6IFt0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMuZmllbGQubmFtZV0udmFsdWVdKSA6IFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMkIGFzIEJlaGF2aW9yU3ViamVjdDxhbnlbXT4pLm5leHQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpZWxkLm9wdGlvbnMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zJCA9IHRoaXMuZmllbGQub3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZmllbGQub3B0aW9ucyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zJCA9IHRoaXMuZmllbGQub3B0aW9ucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zJCA9IG9mKHRoaXMuZmllbGQub3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBvcGVuQ2hhbmdlKCRldmVudDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5maWVsZC5sYXp5KSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5DaGFuZ2UkLm5leHQoJGV2ZW50KTtcbiAgICAgICAgICAgIC8vIGlmICgkZXZlbnQpIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoISh0aGlzLmZpZWxkLm9wdGlvbnMgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSkge1xuICAgICAgICAgICAgLy8gICAgICAgICAodGhpcy5vcHRpb25zJCBhcyBCZWhhdmlvclN1YmplY3Q8YW55W10+KS5uZXh0KHRoaXMuZmllbGQub3B0aW9ucyk7XG4gICAgICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLmZpZWxkLm9wdGlvbnMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAodGhpcy5vcHRpb25zJCBhcyBCZWhhdmlvclN1YmplY3Q8YW55W10+KS5uZXh0KG9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgLy8gICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgICh0aGlzLm9wdGlvbnMkIGFzIEJlaGF2aW9yU3ViamVjdDxhbnlbXT4pXG4gICAgICAgICAgICAvLyAgICAgICAgIC5uZXh0KHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS52YWx1ZSAhPT0gdW5kZWZpbmVkID8gW3RoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5uYW1lXS52YWx1ZV0gOiBbXSk7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAvLyAgICAgLy8gdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmllbGQudmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBhcmVGbiA9IChvMTogYW55LCBvMjogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmZpZWxkLnByb3BlcnR5ICYmIG8xICYmIG8yKSB7XG4gICAgICAgICAgICByZXR1cm4gbzFbdGhpcy5maWVsZC5wcm9wZXJ0eV0gPT09IG8yW3RoaXMuZmllbGQucHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvMSA9PT0gbzI7XG4gICAgfVxufVxuIl19