@sumaris-net/ngx-components 2.4.23-rc2 → 2.5.0-beta2
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/doc/changelog.md +0 -3
- package/esm2020/public_api.mjs +2 -1
- package/esm2020/src/app/core/account/account.module.mjs +8 -4
- package/esm2020/src/app/core/account/account.page.mjs +78 -32
- package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +28 -10
- package/esm2020/src/app/core/form/properties/properties.module.mjs +14 -6
- package/esm2020/src/app/core/form/properties/properties.table.mjs +218 -0
- package/esm2020/src/app/core/form/properties/property.validator.mjs +1 -1
- package/esm2020/src/app/core/services/account.service.mjs +31 -7
- package/esm2020/src/app/core/services/config/core.config.mjs +8 -1
- package/esm2020/src/app/core/services/model/account.model.mjs +72 -4
- package/esm2020/src/app/core/services/model/settings.model.mjs +1 -73
- package/esm2020/src/app/core/services/validator/account.validator.mjs +13 -10
- package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +7 -9
- package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +1 -1
- package/esm2020/src/app/shared/dates.mjs +1 -7
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +7 -11
- package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +3 -3
- package/esm2020/src/app/shared/toolbar/toolbar.mjs +6 -7
- package/fesm2015/sumaris-net.ngx-components.mjs +4144 -3848
- package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
- package/fesm2020/sumaris-net.ngx-components.mjs +4030 -3756
- package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/core/account/account.module.d.ts +2 -1
- package/src/app/core/account/account.page.d.ts +17 -13
- package/src/app/core/form/entity/entity-editor.class.d.ts +1 -1
- package/src/app/core/form/properties/properties.module.d.ts +5 -3
- package/src/app/core/form/properties/properties.table.d.ts +66 -0
- package/src/app/core/services/account.service.d.ts +16 -7
- package/src/app/core/services/config/core.config.d.ts +1 -0
- package/src/app/core/services/model/account.model.d.ts +16 -2
- package/src/app/core/services/model/settings.model.d.ts +0 -15
- package/src/app/core/services/validator/account.validator.d.ts +3 -1
- package/src/app/core/services/validator/user-settings.validator.d.ts +1 -1
- package/src/app/shared/dates.d.ts +0 -1
- package/src/app/shared/toolbar/toolbar.d.ts +2 -2
- package/src/assets/i18n/en-US.json +12 -1
- package/src/assets/i18n/en.json +12 -1
- package/src/assets/i18n/fr.json +17 -13
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { AppInMemoryTable } from '../../table/memory-table.class';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, Directive, Inject, Input } from '@angular/core';
|
|
4
|
+
import { RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../../table/table.model';
|
|
5
|
+
import { InMemoryEntitiesService } from '../../../shared/services/memory-entity-service.class';
|
|
6
|
+
import { Entity, EntityUtils } from '../../services/model/entity.model';
|
|
7
|
+
import { AppValidatorService } from '../../services/validator/base.validator.class';
|
|
8
|
+
import { Validators } from '@angular/forms';
|
|
9
|
+
import { isNotEmptyArray, isNotNil, isNotNilOrBlank } from '../../../shared/functions';
|
|
10
|
+
import { BehaviorSubject } from 'rxjs';
|
|
11
|
+
import { ENVIRONMENT } from '../../../../environments/environment.class';
|
|
12
|
+
import { EntityClass } from '../../services/model/entity.decorators';
|
|
13
|
+
import { EntityFilter } from '../../services/model/filter.model';
|
|
14
|
+
import { debounceTime, filter, tap } from 'rxjs/operators';
|
|
15
|
+
import { AppFormUtils } from '../form.utils';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "@angular/forms";
|
|
18
|
+
import * as i2 from "@angular/common";
|
|
19
|
+
import * as i3 from "@ionic/angular";
|
|
20
|
+
import * as i4 from "@ngx-translate/core";
|
|
21
|
+
import * as i5 from "@angular/material/table";
|
|
22
|
+
import * as i6 from "@angular/material/sort";
|
|
23
|
+
import * as i7 from "@angular/material/toolbar";
|
|
24
|
+
import * as i8 from "@angular/material/icon";
|
|
25
|
+
import * as i9 from "@angular/material/button";
|
|
26
|
+
import * as i10 from "@angular/material/slide-toggle";
|
|
27
|
+
import * as i11 from "@angular/cdk/a11y";
|
|
28
|
+
import * as i12 from "../../../shared/material/autocomplete/material.autocomplete";
|
|
29
|
+
import * as i13 from "../../../shared/form/field.component";
|
|
30
|
+
import * as i14 from "../../table/actions-column.component";
|
|
31
|
+
import * as i15 from "../../../shared/pipes/property.pipes";
|
|
32
|
+
import * as i16 from "../../../shared/pipes/form.pipes";
|
|
33
|
+
import * as i17 from "../../../../environments/environment.class";
|
|
34
|
+
let PropertyEntity = class PropertyEntity extends Entity {
|
|
35
|
+
constructor() {
|
|
36
|
+
super(...arguments);
|
|
37
|
+
this.definition = null;
|
|
38
|
+
this.value = null;
|
|
39
|
+
}
|
|
40
|
+
fromObject(source) {
|
|
41
|
+
super.fromObject(source);
|
|
42
|
+
this.id = source.definition?.key || source.id;
|
|
43
|
+
this.definition = source.definition;
|
|
44
|
+
this.value = source.value;
|
|
45
|
+
}
|
|
46
|
+
asObject(opts) {
|
|
47
|
+
const target = super.asObject(opts);
|
|
48
|
+
target.id = this.definition.key;
|
|
49
|
+
delete target.definition;
|
|
50
|
+
return target;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
PropertyEntity = __decorate([
|
|
54
|
+
EntityClass({ typename: 'PropertyEntity' })
|
|
55
|
+
], PropertyEntity);
|
|
56
|
+
export { PropertyEntity };
|
|
57
|
+
export class PropertyEntityFilter extends EntityFilter {
|
|
58
|
+
constructor() {
|
|
59
|
+
super(...arguments);
|
|
60
|
+
this.all = false;
|
|
61
|
+
}
|
|
62
|
+
fromObject(source) {
|
|
63
|
+
super.fromObject(source);
|
|
64
|
+
this.all = source.all;
|
|
65
|
+
}
|
|
66
|
+
asObject(opts) {
|
|
67
|
+
return super.asObject(opts);
|
|
68
|
+
}
|
|
69
|
+
buildFilter() {
|
|
70
|
+
const filterFns = super.buildFilter();
|
|
71
|
+
if (!this.all) {
|
|
72
|
+
filterFns.push(data => isNotNil(data.value));
|
|
73
|
+
}
|
|
74
|
+
return filterFns;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export class PropertyEntityValidator extends AppValidatorService {
|
|
78
|
+
constructor(formBuilder) {
|
|
79
|
+
super(formBuilder, null);
|
|
80
|
+
this.formBuilder = formBuilder;
|
|
81
|
+
}
|
|
82
|
+
getFormGroupConfig(data) {
|
|
83
|
+
return {
|
|
84
|
+
id: [data?.id || null],
|
|
85
|
+
definition: [data?.definition || null, Validators.required],
|
|
86
|
+
value: [data?.value || null]
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
PropertyEntityValidator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PropertyEntityValidator, deps: [{ token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Directive });
|
|
91
|
+
PropertyEntityValidator.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: PropertyEntityValidator, usesInheritance: true, ngImport: i0 });
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PropertyEntityValidator, decorators: [{
|
|
93
|
+
type: Directive
|
|
94
|
+
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }]; } });
|
|
95
|
+
export class AppPropertiesTable extends AppInMemoryTable {
|
|
96
|
+
constructor(injector, formBuilder, validatorService, environment) {
|
|
97
|
+
super(injector, [...RESERVED_START_COLUMNS, 'definition', 'value', ...RESERVED_END_COLUMNS], PropertyEntity, new InMemoryEntitiesService(PropertyEntity, PropertyEntityFilter, {
|
|
98
|
+
sortByReplacement: { definition: 'definition.translatedLabel' }
|
|
99
|
+
}), validatorService);
|
|
100
|
+
this.injector = injector;
|
|
101
|
+
this.formBuilder = formBuilder;
|
|
102
|
+
this.validatorService = validatorService;
|
|
103
|
+
this.showToolbar = true;
|
|
104
|
+
this.availableDefinitions$ = new BehaviorSubject([]);
|
|
105
|
+
this.definitionsMapByKey = {};
|
|
106
|
+
this.translationsByKey = {};
|
|
107
|
+
this.toTranslatedFormFieldDefinition = (definition) => ({ ...definition, translatedLabel: this.translationsByKey[definition.label] });
|
|
108
|
+
this.inlineEdition = true;
|
|
109
|
+
this.defaultSortBy = 'definition';
|
|
110
|
+
this.defaultSortDirection = 'asc';
|
|
111
|
+
this.debug = !environment?.production;
|
|
112
|
+
this.filterForm = formBuilder.group({
|
|
113
|
+
all: [null]
|
|
114
|
+
});
|
|
115
|
+
this.autoLoad = false;
|
|
116
|
+
}
|
|
117
|
+
ngOnInit() {
|
|
118
|
+
super.ngOnInit();
|
|
119
|
+
// Fill options map
|
|
120
|
+
this.definitionsMapByKey = {};
|
|
121
|
+
this.definitions?.forEach(o => {
|
|
122
|
+
this.definitionsMapByKey[o.key] = o;
|
|
123
|
+
});
|
|
124
|
+
this.registerAutocompleteField('definition', {
|
|
125
|
+
attributes: ['translatedLabel'],
|
|
126
|
+
columnNames: [this.i18nColumnPrefix + 'DEFINITION'],
|
|
127
|
+
items: this.availableDefinitions$,
|
|
128
|
+
equals: (o1, o2) => o1?.key === o2?.key,
|
|
129
|
+
});
|
|
130
|
+
this.registerCellValueChanges('definition').subscribe((definition) => {
|
|
131
|
+
if (isNotNil(definition) && this.editedRow?.id === -1) {
|
|
132
|
+
this.editedRow.validator.patchValue({ id: definition.key, value: definition.defaultValue });
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
this.registerCellValueChanges('value').subscribe(() => {
|
|
136
|
+
this.markAsDirty();
|
|
137
|
+
});
|
|
138
|
+
this.registerSubscription(this.filterForm.valueChanges
|
|
139
|
+
.pipe(debounceTime(250), filter((_) => {
|
|
140
|
+
const valid = this.filterForm.valid;
|
|
141
|
+
if (!valid && this.debug)
|
|
142
|
+
AppFormUtils.logFormErrors(this.filterForm);
|
|
143
|
+
return valid;
|
|
144
|
+
}),
|
|
145
|
+
// Update the filter
|
|
146
|
+
tap(json => this.setFilter(json)))
|
|
147
|
+
.subscribe());
|
|
148
|
+
this.markAsReady();
|
|
149
|
+
}
|
|
150
|
+
get value() {
|
|
151
|
+
let values = super.value || [];
|
|
152
|
+
// remove unset options
|
|
153
|
+
values = values.filter(property => isNotNil(property.value));
|
|
154
|
+
return values;
|
|
155
|
+
}
|
|
156
|
+
set value(data) {
|
|
157
|
+
super.value = data;
|
|
158
|
+
}
|
|
159
|
+
setValue(value, opts) {
|
|
160
|
+
// Update translations
|
|
161
|
+
this.translationsByKey = isNotEmptyArray(this.definitions) ? this.translate.instant(this.definitions.map(def => def.label)) : {};
|
|
162
|
+
const properties = (value || []).slice();
|
|
163
|
+
// Affect definition
|
|
164
|
+
properties.forEach(property => {
|
|
165
|
+
const definition = this.definitionsMapByKey[property.id];
|
|
166
|
+
property.definition = this.toTranslatedFormFieldDefinition(definition);
|
|
167
|
+
});
|
|
168
|
+
// Add other definitions (no value)
|
|
169
|
+
properties.push(...this.definitions
|
|
170
|
+
.filter(definition => !properties.map(property => property.id).includes(definition.key))
|
|
171
|
+
.map(definition => PropertyEntity.fromObject({
|
|
172
|
+
id: definition.key,
|
|
173
|
+
definition: this.toTranslatedFormFieldDefinition(definition),
|
|
174
|
+
value: null
|
|
175
|
+
})));
|
|
176
|
+
// init filter
|
|
177
|
+
this.filterForm.patchValue({ all: false });
|
|
178
|
+
super.setValue(properties, opts);
|
|
179
|
+
}
|
|
180
|
+
confirmEditCreate(event, row) {
|
|
181
|
+
try {
|
|
182
|
+
return super.confirmEditCreate(event, row);
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
this.updateAvailableDefinitions();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async updateView(res, opts) {
|
|
189
|
+
await super.updateView(res, opts);
|
|
190
|
+
this.updateAvailableDefinitions();
|
|
191
|
+
}
|
|
192
|
+
async updateAvailableDefinitions() {
|
|
193
|
+
const usedDefinitionsKeys = this.dataSource.getRows().map(row => row.currentData?.id).filter(isNotNilOrBlank) || [];
|
|
194
|
+
const availableDefinitions = (this.definitions || []).slice()
|
|
195
|
+
.filter(value => !usedDefinitionsKeys.includes(value.key))
|
|
196
|
+
.map(this.toTranslatedFormFieldDefinition);
|
|
197
|
+
EntityUtils.sort(availableDefinitions, 'translatedLabel', 'asc');
|
|
198
|
+
this.availableDefinitions$.next(availableDefinitions);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
AppPropertiesTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AppPropertiesTable, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: PropertyEntityValidator }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
202
|
+
AppPropertiesTable.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AppPropertiesTable, selector: "app-properties-table", inputs: { definitions: "definitions", showToolbar: "showToolbar" }, providers: [
|
|
203
|
+
{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }
|
|
204
|
+
], usesInheritance: true, ngImport: i0, template: "<mat-toolbar *ngIf=\"showToolbar\">\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n hidden-xs hidden-sm hidden-mobile\n *ngIf=\"enabled\"\n [title]=\"'COMMON.BTN_ADD'|translate\" (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- Delete -->\n <button mat-icon-button *ngIf=\"enabled\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n </ng-template>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n\n <ion-text translate>SETTINGS.BTN_SHOW_ALL_PROPERTIES</ion-text>\n <mat-slide-toggle formControlName=\"all\" style=\"padding-left: 5px\">\n </mat-slide-toggle>\n\n </form>\n\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- table -->\n <div class=\"table-container\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"(row.validator | formGetValue : ['definition', 'defaultValue']) === (row.validator | formGetValue : 'value')\">\n <mat-autocomplete-field\n *ngIf=\"row.id === -1; else readOnlyDefinition\"\n floatLabel=\"never\"\n [formControl]=\"row.validator | formGetControl : 'definition'\"\n [config]=\"autocompleteFields.definition\"\n [required]=\"true\"\n ></mat-autocomplete-field>\n <ng-template #readOnlyDefinition>\n {{ row.currentData | propertyGet : 'definition.translatedLabel' }}\n </ng-template>\n </td>\n </ng-container>\n\n <!-- value column -->\n <ng-container matColumnDef=\"value\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label>{{ i18nColumnPrefix + 'VALUE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <app-form-field\n *ngIf=\"row.validator | formGetValue: 'id'\"\n floatLabel=\"never\"\n [definition]=\"definitionsMapByKey[row.validator | formGetValue: 'id']\"\n [formControl]=\"row.validator | formGetControl:'value'\"\n [placeholder]=\"i18nColumnPrefix + 'VALUE' | translate\"\n [required]=\"true\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button type=\"button\" mat-icon-button\n *ngIf=\"!mobile && !disabled\"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteRow($event, row)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n </div>\n</ion-content>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i7.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i11.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i12.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "appearance", "placeholder", "suggestFn", "required", "mobile", "clearable", "debounceTime", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "class", "panelWidth", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "component", type: i13.AppFormField, selector: "app-form-field", inputs: ["definition", "required", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "floatLabel", "tabindex", "autofocus", "chipColor", "class"], outputs: ["keyup.enter"] }, { kind: "component", type: i14.ActionsColumnComponent, selector: "app-actions-column", inputs: ["stickyEnd", "canCancel", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i16.FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
205
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AppPropertiesTable, decorators: [{
|
|
206
|
+
type: Component,
|
|
207
|
+
args: [{ selector: 'app-properties-table', providers: [
|
|
208
|
+
{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }
|
|
209
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar *ngIf=\"showToolbar\">\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n <!-- Add -->\n <button mat-icon-button\n hidden-xs hidden-sm hidden-mobile\n *ngIf=\"enabled\"\n [title]=\"'COMMON.BTN_ADD'|translate\" (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- Delete -->\n <button mat-icon-button *ngIf=\"enabled\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n\n </ng-template>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"onRefresh.emit()\">\n\n <ion-text translate>SETTINGS.BTN_SHOW_ALL_PROPERTIES</ion-text>\n <mat-slide-toggle formControlName=\"all\" style=\"padding-left: 5px\">\n </mat-slide-toggle>\n\n </form>\n\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <!-- table -->\n <div class=\"table-container\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"(row.validator | formGetValue : ['definition', 'defaultValue']) === (row.validator | formGetValue : 'value')\">\n <mat-autocomplete-field\n *ngIf=\"row.id === -1; else readOnlyDefinition\"\n floatLabel=\"never\"\n [formControl]=\"row.validator | formGetControl : 'definition'\"\n [config]=\"autocompleteFields.definition\"\n [required]=\"true\"\n ></mat-autocomplete-field>\n <ng-template #readOnlyDefinition>\n {{ row.currentData | propertyGet : 'definition.translatedLabel' }}\n </ng-template>\n </td>\n </ng-container>\n\n <!-- value column -->\n <ng-container matColumnDef=\"value\">\n <th mat-header-cell *matHeaderCellDef>\n <ion-label>{{ i18nColumnPrefix + 'VALUE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <app-form-field\n *ngIf=\"row.validator | formGetValue: 'id'\"\n floatLabel=\"never\"\n [definition]=\"definitionsMapByKey[row.validator | formGetValue: 'id']\"\n [formControl]=\"row.validator | formGetControl:'value'\"\n [placeholder]=\"i18nColumnPrefix + 'VALUE' | translate\"\n [required]=\"true\">\n </app-form-field>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\">\n\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button type=\"button\" mat-icon-button\n *ngIf=\"!mobile && !disabled\"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"deleteRow($event, row)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n </ng-template>\n\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n </div>\n</ion-content>\n" }]
|
|
210
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: PropertyEntityValidator }, { type: i17.Environment, decorators: [{
|
|
211
|
+
type: Inject,
|
|
212
|
+
args: [ENVIRONMENT]
|
|
213
|
+
}] }]; }, propDecorators: { definitions: [{
|
|
214
|
+
type: Input
|
|
215
|
+
}], showToolbar: [{
|
|
216
|
+
type: Input
|
|
217
|
+
}] } });
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy50YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQzdGLE9BQU8sRUFBQyxNQUFNLEVBQXlCLFdBQVcsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzdGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBdUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEYsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFckYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEVBQWMsV0FBVyxFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFFcEYsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFB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RUFBQztxQkFDdEUsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07OzBCQWdCNUMsTUFBTTsyQkFBQyxXQUFXOzRDQVpaLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwSW5NZW1vcnlUYWJsZX0gZnJvbSAnLi4vLi4vdGFibGUvbWVtb3J5LXRhYmxlLmNsYXNzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGlyZWN0aXZlLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UkVTRVJWRURfRU5EX0NPTFVNTlMsIFJFU0VSVkVEX1NUQVJUX0NPTFVNTlN9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7SW5NZW1vcnlFbnRpdGllc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9tZW1vcnktZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtFbnRpdHksIEVudGl0eUFzT2JqZWN0T3B0aW9ucywgRW50aXR5VXRpbHN9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQge0FwcFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRvci9iYXNlLnZhbGlkYXRvci5jbGFzcyc7XG5pbXBvcnQge1VudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtGb3JtRmllbGREZWZpbml0aW9uLCBGb3JtRmllbGREZWZpbml0aW9uTWFwfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQge2lzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFua30gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0ZpbHRlckZuLCBMb2FkUmVzdWx0fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlR9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQge1RhYmxlRWxlbWVudH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7RW50aXR5Q2xhc3N9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5kZWNvcmF0b3JzJztcbmltcG9ydCB7RW50aXR5RmlsdGVyfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9maWx0ZXIubW9kZWwnO1xuaW1wb3J0IHtPYmplY3RNYXB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZmlsdGVyLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7QXBwRm9ybVV0aWxzfSBmcm9tICcuLi9mb3JtLnV0aWxzJztcblxuaW50ZXJmYWNlIFRyYW5zbGF0ZWRGb3JtRmllbGREZWZpbml0aW9uIGV4dGVuZHMgRm9ybUZpZWxkRGVmaW5pdGlvbiB7XG4gIHRyYW5zbGF0ZWRMYWJlbD86IHN0cmluZztcbn1cblxuQEVudGl0eUNsYXNzKHt0eXBlbmFtZTogJ1Byb3BlcnR5RW50aXR5J30pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFbnRpdHkgZXh0ZW5kcyBFbnRpdHk8UHJvcGVydHlFbnRpdHksIHN0cmluZz4ge1xuICBzdGF0aWMgZnJvbU9iamVjdDogKHNvdXJjZTogYW55LCBvcHRzPzogYW55KSA9PiBQcm9wZXJ0eUVudGl0eTtcblxuICBkZWZpbml0aW9uOiBUcmFuc2xhdGVkRm9ybUZpZWxkRGVmaW5pdGlvbiA9IG51bGw7XG4gIHZhbHVlOiBhbnkgPSBudWxsO1xuXG4gIGZyb21PYmplY3Qoc291cmNlOiBhbnkpIHtcbiAgICBzdXBlci5mcm9tT2JqZWN0KHNvdXJjZSk7XG4gICAgdGhpcy5pZCA9IHNvdXJjZS5kZWZpbml0aW9uPy5rZXkgfHwgc291cmNlLmlkO1xuICAgIHRoaXMuZGVmaW5pdGlvbiA9IHNvdXJjZS5kZWZpbml0aW9uO1xuICAgIHRoaXMudmFsdWUgPSBzb3VyY2UudmFsdWU7XG4gIH1cblxuICBhc09iamVjdChvcHRzPzogRW50aXR5QXNPYmplY3RPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCB0YXJnZXQgPSBzdXBlci5hc09iamVjdChvcHRzKTtcbiAgICB0YXJnZXQuaWQgPSB0aGlzLmRlZmluaXRpb24ua2V5O1xuICAgIGRlbGV0ZSB0YXJnZXQuZGVmaW5pdGlvbjtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVudGl0eUZpbHRlciBleHRlbmRzIEVudGl0eUZpbHRlcjxQcm9wZXJ0eUVudGl0eUZpbHRlciwgUHJvcGVydHlFbnRpdHk+IHtcbiAgc3RhdGljIGZyb21PYmplY3Q6IChzb3VyY2UsIG9wdHM/OiBhbnkpID0+IFByb3BlcnR5RW50aXR5RmlsdGVyO1xuXG4gIGFsbCA9IGZhbHNlO1xuXG4gIGZyb21PYmplY3Qoc291cmNlOiBhbnkpIHtcbiAgICBzdXBlci5mcm9tT2JqZWN0KHNvdXJjZSk7XG4gICAgdGhpcy5hbGwgPSBzb3VyY2UuYWxsO1xuICB9XG5cbiAgYXNPYmplY3Qob3B0cz86IEVudGl0eUFzT2JqZWN0T3B0aW9ucyk6IGFueSB7XG4gICAgcmV0dXJuIHN1cGVyLmFzT2JqZWN0KG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRmlsdGVyKCk6IEZpbHRlckZuPFByb3BlcnR5RW50aXR5PltdIHtcbiAgICBjb25zdCBmaWx0ZXJGbnMgPSBzdXBlci5idWlsZEZpbHRlcigpO1xuXG4gICAgaWYgKCF0aGlzLmFsbCkge1xuICAgICAgZmlsdGVyRm5zLnB1c2goZGF0YSA9PiBpc05vdE5pbChkYXRhLnZhbHVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlckZucztcbiAgfVxufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVudGl0eVZhbGlkYXRvciBleHRlbmRzIEFwcFZhbGlkYXRvclNlcnZpY2U8UHJvcGVydHlFbnRpdHk+IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlclxuICApIHtcbiAgICBzdXBlcihmb3JtQnVpbGRlciwgbnVsbCk7XG4gIH1cblxuICBnZXRGb3JtR3JvdXBDb25maWcoZGF0YT86IFByb3BlcnR5RW50aXR5KTogeyBbcDogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogW2RhdGE/LmlkIHx8IG51bGxdLFxuICAgICAgZGVmaW5pdGlvbjogW2RhdGE/LmRlZmluaXRpb24gfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogW2RhdGE/LnZhbHVlIHx8IG51bGxdXG4gICAgfTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvcGVydGllcy10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAncHJvcGVydGllcy50YWJsZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3Byb3BlcnRpZXMudGFibGUuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7cHJvdmlkZTogUHJvcGVydHlFbnRpdHlWYWxpZGF0b3IsIHVzZUNsYXNzOiBQcm9wZXJ0eUVudGl0eVZhbGlkYXRvcn1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQXBwUHJvcGVydGllc1RhYmxlIGV4dGVuZHMgQXBwSW5NZW1vcnlUYWJsZTxQcm9wZXJ0eUVudGl0eSwgUHJvcGVydHlFbnRpdHlGaWx0ZXIsIHN0cmluZz4gaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGRlZmluaXRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIEBJbnB1dCgpIHNob3dUb29sYmFyID0gdHJ1ZTtcblxuICBhdmFpbGFibGVEZWZpbml0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRyYW5zbGF0ZWRGb3JtRmllbGREZWZpbml0aW9uW10+KFtdKTtcbiAgZGVmaW5pdGlvbnNNYXBCeUtleTogRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCA9IHt9O1xuICB0cmFuc2xhdGlvbnNCeUtleTogT2JqZWN0TWFwPHN0cmluZz4gPSB7fTtcbiAgZmlsdGVyRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByb3RlY3RlZCB2YWxpZGF0b3JTZXJ2aWNlOiBQcm9wZXJ0eUVudGl0eVZhbGlkYXRvcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnRcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBpbmplY3RvcixcbiAgICAgIFsuLi5SRVNFUlZFRF9TVEFSVF9DT0xVTU5TLCAnZGVmaW5pdGlvbicsICd2YWx1ZScsIC4uLlJFU0VSVkVEX0VORF9DT0xVTU5TXSxcbiAgICAgIFByb3BlcnR5RW50aXR5LFxuICAgICAgbmV3IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlKFByb3BlcnR5RW50aXR5LCBQcm9wZXJ0eUVudGl0eUZpbHRlciwge1xuICAgICAgICBzb3J0QnlSZXBsYWNlbWVudDoge2RlZmluaXRpb246ICdkZWZpbml0aW9uLnRyYW5zbGF0ZWRMYWJlbCd9XG4gICAgICB9KSxcbiAgICAgIHZhbGlkYXRvclNlcnZpY2VcbiAgICApO1xuXG4gICAgdGhpcy5pbmxpbmVFZGl0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmRlZmF1bHRTb3J0QnkgPSAnZGVmaW5pdGlvbic7XG4gICAgdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIHRoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQ/LnByb2R1Y3Rpb247XG5cbiAgICB0aGlzLmZpbHRlckZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBhbGw6IFtudWxsXVxuICAgIH0pO1xuXG4gICAgdGhpcy5hdXRvTG9hZCA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIEZpbGwgb3B0aW9ucyBtYXBcbiAgICB0aGlzLmRlZmluaXRpb25zTWFwQnlLZXkgPSB7fTtcbiAgICB0aGlzLmRlZmluaXRpb25zPy5mb3JFYWNoKG8gPT4ge1xuICAgICAgdGhpcy5kZWZpbml0aW9uc01hcEJ5S2V5W28ua2V5XSA9IG87XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyQXV0b2NvbXBsZXRlRmllbGQoJ2RlZmluaXRpb24nLCB7XG4gICAgICBhdHRyaWJ1dGVzOiBbJ3RyYW5zbGF0ZWRMYWJlbCddLFxuICAgICAgY29sdW1uTmFtZXM6IFt0aGlzLmkxOG5Db2x1bW5QcmVmaXggKyAnREVGSU5JVElPTiddLFxuICAgICAgaXRlbXM6IHRoaXMuYXZhaWxhYmxlRGVmaW5pdGlvbnMkLFxuICAgICAgZXF1YWxzOiAobzEsIG8yKSA9PiBvMT8ua2V5ID09PSBvMj8ua2V5LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlckNlbGxWYWx1ZUNoYW5nZXMoJ2RlZmluaXRpb24nKS5zdWJzY3JpYmUoKGRlZmluaXRpb24pID0+IHtcbiAgICAgIGlmIChpc05vdE5pbChkZWZpbml0aW9uKSAmJiB0aGlzLmVkaXRlZFJvdz8uaWQgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuZWRpdGVkUm93LnZhbGlkYXRvci5wYXRjaFZhbHVlKHtpZDogZGVmaW5pdGlvbi5rZXksIHZhbHVlOiBkZWZpbml0aW9uLmRlZmF1bHRWYWx1ZX0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlckNlbGxWYWx1ZUNoYW5nZXMoJ3ZhbHVlJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmZpbHRlckZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgIGZpbHRlcigoXykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsaWQgPSB0aGlzLmZpbHRlckZvcm0udmFsaWQ7XG4gICAgICAgICAgICBpZiAoIXZhbGlkICYmIHRoaXMuZGVidWcpIEFwcEZvcm1VdGlscy5sb2dGb3JtRXJyb3JzKHRoaXMuZmlsdGVyRm9ybSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gVXBkYXRlIHRoZSBmaWx0ZXJcbiAgICAgICAgICB0YXAoanNvbiA9PiB0aGlzLnNldEZpbHRlcihqc29uKSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcblxuICAgIHRoaXMubWFya0FzUmVhZHkoKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBQcm9wZXJ0eUVudGl0eVtdIHtcbiAgICBsZXQgdmFsdWVzID0gc3VwZXIudmFsdWUgfHwgW107XG5cbiAgICAvLyByZW1vdmUgdW5zZXQgb3B0aW9uc1xuICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIocHJvcGVydHkgPT4gaXNOb3ROaWwocHJvcGVydHkudmFsdWUpKTtcblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBzZXQgdmFsdWUoZGF0YTogUHJvcGVydHlFbnRpdHlbXSkge1xuICAgIHN1cGVyLnZhbHVlID0gZGF0YTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBQcm9wZXJ0eUVudGl0eVtdLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcblxuICAgIC8vIFVwZGF0ZSB0cmFuc2xhdGlvbnNcbiAgICB0aGlzLnRyYW5zbGF0aW9uc0J5S2V5ID0gaXNOb3RFbXB0eUFycmF5KHRoaXMuZGVmaW5pdGlvbnMpID8gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLmRlZmluaXRpb25zLm1hcChkZWYgPT4gZGVmLmxhYmVsKSkgOiB7fTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSAodmFsdWUgfHwgW10pLnNsaWNlKCk7XG5cbiAgICAvLyBBZmZlY3QgZGVmaW5pdGlvblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gdGhpcy5kZWZpbml0aW9uc01hcEJ5S2V5W3Byb3BlcnR5LmlkXTtcbiAgICAgIHByb3BlcnR5LmRlZmluaXRpb24gPSB0aGlzLnRvVHJhbnNsYXRlZEZvcm1GaWVsZERlZmluaXRpb24oZGVmaW5pdGlvbik7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgb3RoZXIgZGVmaW5pdGlvbnMgKG5vIHZhbHVlKVxuICAgIHByb3BlcnRpZXMucHVzaChcbiAgICAgIC4uLnRoaXMuZGVmaW5pdGlvbnNcbiAgICAgICAgLmZpbHRlcihkZWZpbml0aW9uID0+ICFwcm9wZXJ0aWVzLm1hcChwcm9wZXJ0eSA9PiBwcm9wZXJ0eS5pZCkuaW5jbHVkZXMoZGVmaW5pdGlvbi5rZXkpKVxuICAgICAgICAubWFwKGRlZmluaXRpb24gPT4gUHJvcGVydHlFbnRpdHkuZnJvbU9iamVjdCh7XG4gICAgICAgICAgaWQ6IGRlZmluaXRpb24ua2V5LFxuICAgICAgICAgIGRlZmluaXRpb246IHRoaXMudG9UcmFuc2xhdGVkRm9ybUZpZWxkRGVmaW5pdGlvbihkZWZpbml0aW9uKSxcbiAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9KSlcbiAgICApO1xuXG4gICAgLy8gaW5pdCBmaWx0ZXJcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7YWxsOiBmYWxzZX0pO1xuXG4gICAgc3VwZXIuc2V0VmFsdWUocHJvcGVydGllcywgb3B0cyk7XG4gIH1cblxuICBjb25maXJtRWRpdENyZWF0ZShldmVudD86IEV2ZW50LCByb3c/OiBUYWJsZUVsZW1lbnQ8UHJvcGVydHlFbnRpdHk+KTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzdXBlci5jb25maXJtRWRpdENyZWF0ZShldmVudCwgcm93KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy51cGRhdGVBdmFpbGFibGVEZWZpbml0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVZpZXcocmVzOiBMb2FkUmVzdWx0PFByb3BlcnR5RW50aXR5PiB8IHVuZGVmaW5lZCwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIudXBkYXRlVmlldyhyZXMsIG9wdHMpO1xuICAgIHRoaXMudXBkYXRlQXZhaWxhYmxlRGVmaW5pdGlvbnMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVBdmFpbGFibGVEZWZpbml0aW9ucygpIHtcbiAgICBjb25zdCB1c2VkRGVmaW5pdGlvbnNLZXlzID0gdGhpcy5kYXRhU291cmNlLmdldFJvd3MoKS5tYXAocm93ID0+IHJvdy5jdXJyZW50RGF0YT8uaWQpLmZpbHRlcihpc05vdE5pbE9yQmxhbmspIHx8IFtdO1xuICAgIGNvbnN0IGF2YWlsYWJsZURlZmluaXRpb25zOiBUcmFuc2xhdGVkRm9ybUZpZWxkRGVmaW5pdGlvbltdID0gKHRoaXMuZGVmaW5pdGlvbnMgfHwgW10pLnNsaWNlKClcbiAgICAgIC5maWx0ZXIodmFsdWUgPT4gIXVzZWREZWZpbml0aW9uc0tleXMuaW5jbHVkZXModmFsdWUua2V5KSlcbiAgICAgIC5tYXAodGhpcy50b1RyYW5zbGF0ZWRGb3JtRmllbGREZWZpbml0aW9uKTtcblxuICAgIEVudGl0eVV0aWxzLnNvcnQoYXZhaWxhYmxlRGVmaW5pdGlvbnMsICd0cmFuc2xhdGVkTGFiZWwnLCAnYXNjJyk7XG5cbiAgICB0aGlzLmF2YWlsYWJsZURlZmluaXRpb25zJC5uZXh0KGF2YWlsYWJsZURlZmluaXRpb25zKTtcbiAgfVxuXG4gIHRvVHJhbnNsYXRlZEZvcm1GaWVsZERlZmluaXRpb24gPSAoZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbik6IFRyYW5zbGF0ZWRGb3JtRmllbGREZWZpbml0aW9uID0+XG4gICAgKHsuLi5kZWZpbml0aW9uLCB0cmFuc2xhdGVkTGFiZWw6IHRoaXMudHJhbnNsYXRpb25zQnlLZXlbZGVmaW5pdGlvbi5sYWJlbF19KTtcblxufVxuIiwiPG1hdC10b29sYmFyICpuZ0lmPVwic2hvd1Rvb2xiYXJcIj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlbGVjdGlvbi5oYXNWYWx1ZSgpOyBlbHNlIGhhc1NlbGVjdGlvblwiPlxuICAgIDwhLS0gQWRkIC0tPlxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBoaWRkZW4teHMgaGlkZGVuLXNtIGhpZGRlbi1tb2JpbGVcbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlZFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fQUREJ3x0cmFuc2xhdGVcIiAoY2xpY2spPVwiYWRkUm93KClcIj5cbiAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBSZWZyZXNoIC0tPlxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIW1vYmlsZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fUkVGUkVTSCd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblJlZnJlc2guZW1pdCgpXCI+XG4gICAgICA8bWF0LWljb24+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBpZiByb3cgc2VsZWN0aW9uIC0tPlxuICA8bmctdGVtcGxhdGUgI2hhc1NlbGVjdGlvbj5cblxuICAgIDwhLS0gRGVsZXRlIC0tPlxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiZW5hYmxlZFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVNlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxpb24taXRlbSAqbmdJZj1cIiFtb2JpbGUgJiYgZXJyb3I7IGxldCBlcnJvclwiIGxpbmVzPVwibm9uZVwiPlxuICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBbaW5uZXJIVE1MXT1cImVycm9yfHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICA8L2lvbi1pdGVtPlxuXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvZGl2PlxuXG4gIDxmb3JtIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIiBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIiAobmdTdWJtaXQpPVwib25SZWZyZXNoLmVtaXQoKVwiPlxuXG4gICAgPGlvbi10ZXh0IHRyYW5zbGF0ZT5TRVRUSU5HUy5CVE5fU0hPV19BTExfUFJPUEVSVElFUzwvaW9uLXRleHQ+XG4gICAgPG1hdC1zbGlkZS10b2dnbGUgZm9ybUNvbnRyb2xOYW1lPVwiYWxsXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDVweFwiPlxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICA8L2Zvcm0+XG5cbjwvbWF0LXRvb2xiYXI+XG5cbjxpb24tY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG5cbiAgPCEtLSB0YWJsZSAtLT5cbiAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgIDx0YWJsZSAjdGFibGUgbWF0LXRhYmxlIG1hdFNvcnQgbWF0U29ydERpc2FibGVDbGVhclxuICAgICAgICAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwiZGVmYXVsdFNvcnRCeVwiXG4gICAgICAgICAgIFttYXRTb3J0RGlyZWN0aW9uXT1cImRlZmF1bHRTb3J0RGlyZWN0aW9uXCJcbiAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeUZuXCI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwidHJ1ZVwiPjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJ0cnVlXCI+PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGlkIGNvbHVtbiAoaGlkZGVuKSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaWRcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhZGVidWdcIj48L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIWRlYnVnXCI+XG4gICAgICAgICAge3sgcm93LmN1cnJlbnREYXRhLmlkIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBkZWZpbml0aW9uIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGVmaW5pdGlvblwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnREVGSU5JVElPTicgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZF09XCIocm93LnZhbGlkYXRvciB8IGZvcm1HZXRWYWx1ZSA6IFsnZGVmaW5pdGlvbicsICdkZWZhdWx0VmFsdWUnXSkgPT09IChyb3cudmFsaWRhdG9yIHwgZm9ybUdldFZhbHVlIDogJ3ZhbHVlJylcIj5cbiAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZS1maWVsZFxuICAgICAgICAgICAgKm5nSWY9XCJyb3cuaWQgPT09IC0xOyBlbHNlIHJlYWRPbmx5RGVmaW5pdGlvblwiXG4gICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3IgfCBmb3JtR2V0Q29udHJvbCA6ICdkZWZpbml0aW9uJ1wiXG4gICAgICAgICAgICBbY29uZmlnXT1cImF1dG9jb21wbGV0ZUZpZWxkcy5kZWZpbml0aW9uXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICA+PC9tYXQtYXV0b2NvbXBsZXRlLWZpZWxkPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVhZE9ubHlEZWZpbml0aW9uPlxuICAgICAgICAgICAge3sgcm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQgOiAnZGVmaW5pdGlvbi50cmFuc2xhdGVkTGFiZWwnIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIHZhbHVlIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidmFsdWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnVkFMVUUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICA8YXBwLWZvcm0tZmllbGRcbiAgICAgICAgICAgICpuZ0lmPVwicm93LnZhbGlkYXRvciB8IGZvcm1HZXRWYWx1ZTogJ2lkJ1wiXG4gICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxuICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiZGVmaW5pdGlvbnNNYXBCeUtleVtyb3cudmFsaWRhdG9yIHwgZm9ybUdldFZhbHVlOiAnaWQnXVwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvciB8IGZvcm1HZXRDb250cm9sOid2YWx1ZSdcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImkxOG5Db2x1bW5QcmVmaXggKyAnVkFMVUUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgPC9hcHAtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEFjdGlvbnMgYnV0dG9ucyBjb2x1bW4gLS0+XG4gICAgICA8YXBwLWFjdGlvbnMtY29sdW1uXG4gICAgICAgIFtzdGlja3lFbmRdPVwidHJ1ZVwiXG4gICAgICAgIFtjYW5DYW5jZWxdPVwiZmFsc2VcIlxuICAgICAgICBbY2FuRGVsZXRlXT1cImZhbHNlXCJcbiAgICAgICAgW2RpcnR5SWNvbl09XCJmYWxzZVwiXG4gICAgICAgIFtjZWxsVGVtcGxhdGVdPVwiY2VsbEluamVjdGlvblwiPlxuXG4gICAgICAgIDwhLS0gY2VsbCBpbmplY3Rpb24tLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsSW5qZWN0aW9uIGxldC1yb3c+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiFtb2JpbGUgJiYgIWRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy52aXNpYmxlLWhvdmVyLXJvd109XCIhbW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdygkZXZlbnQsIHJvdylcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPC9hcHAtYWN0aW9ucy1jb2x1bW4+XG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiXG4gICAgICAgICAgW2NsYXNzLm1hdC1yb3ctc2VsZWN0ZWRdPVwicm93LmVkaXRpbmdcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LWVycm9yXT1cInJvdy52YWxpZGF0b3I/LmludmFsaWRcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LWRpcnR5XT1cInJvdy52YWxpZGF0b3I/LmRpcnR5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3coJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwiZXNjYXBlRWRpdGluZ1JvdygkZXZlbnQpXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cInJvdy52YWxpZGF0b3I/LmludmFsaWRcIj48L3RyPlxuICAgIDwvdGFibGU+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZ1N1YmplY3R8YXN5bmM7IGVsc2Ugbm9SZXN1bHRcIj5cbiAgICAgIDxpb24taXRlbT5cbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub1Jlc3VsdD5cbiAgICAgIDxpb24taXRlbSAqbmdJZj1cInRvdGFsUm93Q291bnQgPT09IDBcIj5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJ0ZXh0LWl0YWxpY1wiIHRyYW5zbGF0ZT5DT01NT04uTk9fUkVTVUxUPC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICA8L2Rpdj5cbjwvaW9uLWNvbnRlbnQ+XG4iXX0=
|
|
@@ -20,4 +20,4 @@ PropertyValidator.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", vers
|
|
|
20
20
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: PropertyValidator, decorators: [{
|
|
21
21
|
type: Directive
|
|
22
22
|
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }]; } });
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHkudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy9wcm9wZXJ0eS52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQXFCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTlELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDOzs7QUFHbEYsTUFBTSxPQUFPLGlCQUFrQixTQUFRLG1CQUE2QjtJQUVsRSxZQUNZLFdBQStCO1FBRXpDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFGZixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFHM0MsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQWU7UUFDaEMsT0FBTztZQUNMLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RixLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUN6RCxDQUFDO0lBQ0osQ0FBQzs7K0dBYlUsaUJBQWlCO21HQUFqQixpQkFBaUI7NEZBQWpCLGlCQUFpQjtrQkFEN0IsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VW50eXBlZEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1Byb3BlcnR5fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHtBcHBWYWxpZGF0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0b3IvYmFzZS52YWxpZGF0b3IuY2xhc3MnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRvciBleHRlbmRzIEFwcFZhbGlkYXRvclNlcnZpY2U8UHJvcGVydHk+IHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlclxuICApIHtcbiAgICBzdXBlcihmb3JtQnVpbGRlciwgbnVsbCk7XG4gIH1cblxuICBnZXRGb3JtR3JvdXBDb25maWcoZGF0YT86IFByb3BlcnR5KTogeyBbcDogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IFtkYXRhICYmIGRhdGEua2V5IHx8IG51bGwsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgoNTApXSldLFxuICAgICAgdmFsdWU6IFtkYXRhICYmIGRhdGEudmFsdWUgfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICB9O1xuICB9XG59XG5cbiJdfQ==
|