@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.
- package/{esm2020 → esm2022}/lib/directive/dynamic-component.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/directive/dynamic-field.directive.mjs +4 -4
- package/esm2022/lib/dynamic-form.component.mjs +188 -0
- package/{esm2020 → esm2022}/lib/fields/array.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/badge.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/button-form.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/button-submit.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/button-toogle-group.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/buttonchecker-form.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/buttonfile-form.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/checkbox.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/chip.component.mjs +14 -14
- package/esm2022/lib/fields/clear.component.mjs +30 -0
- package/{esm2020 → esm2022}/lib/fields/color.component.mjs +10 -10
- package/{esm2020 → esm2022}/lib/fields/date-time.component.mjs +8 -8
- package/{esm2020 → esm2022}/lib/fields/date.component.mjs +8 -8
- package/{esm2020 → esm2022}/lib/fields/field.abstract.mjs +4 -4
- package/{esm2020 → esm2022}/lib/fields/group.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/icon.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/input.clearable.component.mjs +10 -10
- package/esm2022/lib/fields/input.component.mjs +169 -0
- package/{esm2020 → esm2022}/lib/fields/label.component.mjs +6 -6
- package/esm2022/lib/fields/line-break.component.mjs +23 -0
- package/{esm2020 → esm2022}/lib/fields/link.component.mjs +6 -6
- package/esm2022/lib/fields/list-field.component.mjs +122 -0
- package/{esm2020 → esm2022}/lib/fields/radio.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/range.component.mjs +6 -6
- package/esm2022/lib/fields/select.component.mjs +315 -0
- package/esm2022/lib/fields/select.lazy-search.component.mjs +278 -0
- package/esm2022/lib/fields/select.search.component.mjs +396 -0
- package/{esm2020 → esm2022}/lib/fields/selection-list.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/slide-toggle.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/text.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/fields/textarea.component.mjs +10 -10
- package/{esm2020 → esm2022}/lib/forms/button-control.component.mjs +12 -12
- package/{esm2020 → esm2022}/lib/forms/buttonchecker-control.component.mjs +12 -12
- package/{esm2020 → esm2022}/lib/forms/buttonfile-control.component.mjs +12 -12
- package/{esm2020 → esm2022}/lib/kles-material-dynamicforms.module.mjs +97 -97
- package/{esm2020 → esm2022}/lib/matcher/form-error.matcher.mjs +4 -4
- package/esm2022/lib/modules/material.module.mjs +279 -0
- package/{esm2020 → esm2022}/lib/pipe/array.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/pipe/transform.pipe.mjs +4 -4
- package/{fesm2020 → fesm2022}/3kles-kles-material-dynamicforms.mjs +562 -565
- package/fesm2022/3kles-kles-material-dynamicforms.mjs.map +1 -0
- package/lib/directive/dynamic-component.directive.d.ts +1 -1
- package/lib/directive/dynamic-field.directive.d.ts +1 -1
- package/lib/dynamic-form.component.d.ts +1 -1
- package/lib/fields/array.component.d.ts +1 -1
- package/lib/fields/badge.component.d.ts +1 -1
- package/lib/fields/button-form.component.d.ts +1 -1
- package/lib/fields/button-submit.component.d.ts +1 -1
- package/lib/fields/button-toogle-group.component.d.ts +1 -1
- package/lib/fields/buttonchecker-form.component.d.ts +1 -1
- package/lib/fields/buttonfile-form.component.d.ts +1 -1
- package/lib/fields/checkbox.component.d.ts +1 -1
- package/lib/fields/chip.component.d.ts +1 -1
- package/lib/fields/clear.component.d.ts +1 -1
- package/lib/fields/color.component.d.ts +1 -1
- package/lib/fields/date-time.component.d.ts +1 -1
- package/lib/fields/date.component.d.ts +1 -1
- package/lib/fields/field.abstract.d.ts +1 -1
- package/lib/fields/group.component.d.ts +1 -1
- package/lib/fields/icon.component.d.ts +1 -1
- package/lib/fields/input.clearable.component.d.ts +1 -1
- package/lib/fields/input.component.d.ts +1 -1
- package/lib/fields/label.component.d.ts +1 -1
- package/lib/fields/line-break.component.d.ts +1 -1
- package/lib/fields/link.component.d.ts +1 -1
- package/lib/fields/list-field.component.d.ts +1 -1
- package/lib/fields/radio.component.d.ts +1 -1
- package/lib/fields/range.component.d.ts +1 -1
- package/lib/fields/select.component.d.ts +1 -1
- package/lib/fields/select.lazy-search.component.d.ts +1 -1
- package/lib/fields/select.search.component.d.ts +1 -1
- package/lib/fields/selection-list.component.d.ts +1 -1
- package/lib/fields/slide-toggle.component.d.ts +1 -1
- package/lib/fields/text.component.d.ts +1 -1
- package/lib/fields/textarea.component.d.ts +1 -1
- package/lib/forms/button-control.component.d.ts +1 -1
- package/lib/forms/buttonchecker-control.component.d.ts +1 -1
- package/lib/forms/buttonfile-control.component.d.ts +1 -1
- package/lib/modules/material.module.d.ts +1 -1
- package/package.json +19 -26
- package/esm2020/lib/dynamic-form.component.mjs +0 -188
- package/esm2020/lib/fields/clear.component.mjs +0 -31
- package/esm2020/lib/fields/input.component.mjs +0 -169
- package/esm2020/lib/fields/line-break.component.mjs +0 -23
- package/esm2020/lib/fields/list-field.component.mjs +0 -114
- package/esm2020/lib/fields/select.component.mjs +0 -315
- package/esm2020/lib/fields/select.lazy-search.component.mjs +0 -278
- package/esm2020/lib/fields/select.search.component.mjs +0 -396
- package/esm2020/lib/modules/material.module.mjs +0 -285
- package/fesm2015/3kles-kles-material-dynamicforms.mjs +0 -3687
- package/fesm2015/3kles-kles-material-dynamicforms.mjs.map +0 -1
- package/fesm2020/3kles-kles-material-dynamicforms.mjs.map +0 -1
- /package/{esm2020 → esm2022}/3kles-kles-material-dynamicforms.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/controls/array.control.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/controls/control.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/controls/default.control.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/controls/group.control.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/controls/range.control.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/decorators/component.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/enums/type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/factories/field.factory.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/clear-control.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/component.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/directive.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/field.config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/field.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/validator.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/validators/autocomplete.validator.mjs +0 -0
- /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
|