@dsivd/prestations-ng 14.5.23-beta5 → 14.5.23-beta8
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/bundles/dsivd-prestations-ng.umd.js +21 -6
- package/bundles/dsivd-prestations-ng.umd.js.map +1 -1
- package/dsivd-prestations-ng-v14.5.23-beta8.tgz +0 -0
- package/esm2015/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.component.js +23 -8
- package/fesm2015/dsivd-prestations-ng.js +20 -6
- package/fesm2015/dsivd-prestations-ng.js.map +1 -1
- package/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.component.d.ts +4 -1
- package/package.json +1 -1
- package/dsivd-prestations-ng-v14.5.23-beta5.tgz +0 -0
|
Binary file
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Component, forwardRef, Input, ViewChild } from '@angular/core';
|
|
1
|
+
import { Component, forwardRef, Input, ViewChild, ViewChildren } from '@angular/core';
|
|
2
2
|
import { FoehnInputComponent } from '../foehn-input/foehn-input.component';
|
|
3
3
|
import { FoehnAutocompleteComponent } from '../foehn-autocomplete/foehn-autocomplete.component';
|
|
4
4
|
import { ObjectHelper } from '../helpers/object.helper';
|
|
5
|
+
import { first } from 'rxjs/operators';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "../sdk-dictionary/sdk-dictionary.service";
|
|
7
8
|
import * as i2 from "../foehn-autocomplete/foehn-autocomplete.component";
|
|
@@ -14,6 +15,7 @@ export class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComp
|
|
|
14
15
|
this.dictionaryService = dictionaryService;
|
|
15
16
|
this.showEmptyListMessage = false;
|
|
16
17
|
this.srAnnouncements = '';
|
|
18
|
+
this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL_MS = 2000;
|
|
17
19
|
}
|
|
18
20
|
set defaultElementValues(items) {
|
|
19
21
|
this.defaultElementValues_ = [...items];
|
|
@@ -72,7 +74,7 @@ export class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComp
|
|
|
72
74
|
return super.getLabel(elem);
|
|
73
75
|
}
|
|
74
76
|
canBeDeleted(index) {
|
|
75
|
-
return !this.defaultElementValues || !this.defaultElementValues.includes(this.model[index]);
|
|
77
|
+
return !this.disabled && (!this.defaultElementValues || !this.defaultElementValues.includes(this.model[index]));
|
|
76
78
|
}
|
|
77
79
|
onAutocompleteElementsLoaded(elements) {
|
|
78
80
|
// Need to wait for childView to be loaded
|
|
@@ -90,7 +92,7 @@ export class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComp
|
|
|
90
92
|
}
|
|
91
93
|
findElementByModelItem(item) {
|
|
92
94
|
if (!!this.elements && !!this.elements.length) {
|
|
93
|
-
const itemValue = typeof item
|
|
95
|
+
const itemValue = typeof item !== 'object' ? item : this.getValue(item);
|
|
94
96
|
const elem = this.elements.find((element) => this.getValue(element) === itemValue);
|
|
95
97
|
if (!!elem) {
|
|
96
98
|
return elem;
|
|
@@ -146,6 +148,13 @@ export class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComp
|
|
|
146
148
|
this.autocompleteComponent.inputElement.nativeElement.hidden = false;
|
|
147
149
|
// Add back selected item to autocomplete suggestion list
|
|
148
150
|
this.autocompleteComponent.elements = this.filterAutocompleteElements(this.elements);
|
|
151
|
+
// When deleting a selected item, check were to set focus back when no more items to delete
|
|
152
|
+
this.selectedElemRef.changes.pipe(first()).subscribe(() => {
|
|
153
|
+
const selectedElemRefArray = [...this.selectedElemRef.toArray()];
|
|
154
|
+
if (!selectedElemRefArray.length && !!this.selectedItemsArea) {
|
|
155
|
+
this.selectedItemsArea.nativeElement.focus();
|
|
156
|
+
}
|
|
157
|
+
});
|
|
149
158
|
}
|
|
150
159
|
showAlertMessageAndHideAutocomplete() {
|
|
151
160
|
// Show a message to user indicating there is no more suggestions to display
|
|
@@ -155,16 +164,16 @@ export class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComp
|
|
|
155
164
|
this.autocompleteComponent.inputElement.nativeElement.hidden = true;
|
|
156
165
|
}
|
|
157
166
|
manageScreenReaderAnnouncement(element, isDelete) {
|
|
158
|
-
clearTimeout(this.
|
|
167
|
+
clearTimeout(this.srAnnouncementClearTimer);
|
|
159
168
|
if (isDelete) {
|
|
160
169
|
this.srAnnouncements += `${this.dictionaryService.getKeySync('foehn-multiselect-autocomplete.sr-announcement.deleted', { elementLabel: this.getLabel(element) })}`;
|
|
161
170
|
}
|
|
162
171
|
else {
|
|
163
172
|
this.srAnnouncements += `${this.dictionaryService.getKeySync('foehn-multiselect-autocomplete.sr-announcement.added', { elementLabel: this.getLabel(element) })}`;
|
|
164
173
|
}
|
|
165
|
-
this.
|
|
174
|
+
this.srAnnouncementClearTimer = setTimeout(() => {
|
|
166
175
|
this.srAnnouncements = '';
|
|
167
|
-
},
|
|
176
|
+
}, this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL_MS);
|
|
168
177
|
}
|
|
169
178
|
}
|
|
170
179
|
FoehnMultiselectAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiselectAutocompleteComponent, deps: [{ token: i0.NgZone }, { token: i1.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
|
|
@@ -174,7 +183,7 @@ FoehnMultiselectAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVer
|
|
|
174
183
|
useExisting: forwardRef(() => FoehnMultiselectAutocompleteComponent),
|
|
175
184
|
multi: true
|
|
176
185
|
}
|
|
177
|
-
], viewQueries: [{ propertyName: "autocompleteComponent", first: true, predicate: ["autocompleteComponent"], descendants: true }, { propertyName: "alertMessageContainer", first: true, predicate: ["alertMessageContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<foehn-autocomplete\n #autocompleteComponent\n [name]=\"name\"\n [label]=\"label\"\n [elements]=\"elements\"\n [elementsUrl]=\"elementsUrl\"\n [elementValue]=\"elementValue\"\n [elementLabel]=\"elementLabel\"\n [elementValueIdentity]=\"elementValueIdentity\"\n [elementDisabled]=\"elementDisabled\"\n [allElementDisabled]=\"allElementDisabled\"\n [elementGroup]=\"elementGroup\"\n [allowCustomValue]=\"false\"\n [searchValueMinCharsCount]=\"searchValueMinCharsCount\"\n [customValueModelGenerator]=\"customValueModelGenerator\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (userInput)=\"addItem($event)\"\n [(model)]=\"autocompleteInputValue\"\n (elementsLoaded)=\"onAutocompleteElementsLoaded($event)\"\n>\n <small\n *ngIf=\"!showEmptyListMessage\"\n [attr.id]=\"buildChildId('Help')\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText ? helpText : 'foehn-multiselect-autocomplete.autocomplete.screen-reader.label' | fromDictionary\"\n ></small>\n\n <div\n [id]=\"buildChildId('AlertMessageContainer')\"\n role=\"status\"\n #alertMessageContainer\n >\n <p\n *ngIf=\"showEmptyListMessage\"\n class=\"alert alert-info\"\n tabindex=\"0\"\n >{{'foehn-multiselect-autocomplete.autocomplete.empty-message' | fromDictionary}}</p>\n </div>\n</foehn-autocomplete>\n\n<p\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n {{srAnnouncements}}\n</p>\n\n<div\n role=\"presentation\"\n class=\"selected-list-container d-flex align-content-stretch flex-wrap\"\n [ngClass]=\"!!model && !!model.length ? 'mb-2' : 'mb-0'\"\n>\n <ng-container *ngFor=\"let element of model; let index = index; trackBy: trackByFn\">\n <span\n *ngIf=\"!canBeDeleted(index)\"\n class=\"badge badge-pill badge-secondary mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"0\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n >\n {{getLabel(element)}}\n </span>\n <button\n *ngIf=\"canBeDeleted(index)\"\n class=\"btn btn-secondary badge badge-pill mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"0\"\n [attr.aria-label]=\"getDeleteButtonAriaLabel(element)\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n (click)=\"removeItem(element)\"\n >\n {{getLabel(element)}}\n <foehn-icon-times\n aria-hidden=\"true\"\n class=\"ml-2\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n ></foehn-icon-times>\n </button>\n </ng-container>\n</div>\n", styles: ["foehn-autocomplete p.alert:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}.selected-list-container button>.btn,.btn-link{line-height:inherit;padding:0}.selected-list-container .btn{text-transform:none}.selected-list-container span.badge-pill:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}\n"], components: [{ type: i2.FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "customValueModelGenerator"] }, { type: i3.FoehnIconTimesComponent, selector: "foehn-icon-times" }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fromDictionary": i5.SdkDictionaryPipe } });
|
|
186
|
+
], viewQueries: [{ propertyName: "autocompleteComponent", first: true, predicate: ["autocompleteComponent"], descendants: true }, { propertyName: "alertMessageContainer", first: true, predicate: ["alertMessageContainer"], descendants: true }, { propertyName: "selectedItemsArea", first: true, predicate: ["selectedItemsArea"], descendants: true }, { propertyName: "selectedElemRef", predicate: ["selectedElemRef"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<foehn-autocomplete\n #autocompleteComponent\n [name]=\"name\"\n [label]=\"label\"\n [elements]=\"elements\"\n [elementsUrl]=\"elementsUrl\"\n [elementValue]=\"elementValue\"\n [elementLabel]=\"elementLabel\"\n [elementValueIdentity]=\"elementValueIdentity\"\n [elementDisabled]=\"elementDisabled\"\n [allElementDisabled]=\"allElementDisabled\"\n [elementGroup]=\"elementGroup\"\n [allowCustomValue]=\"false\"\n [searchValueMinCharsCount]=\"searchValueMinCharsCount\"\n [customValueModelGenerator]=\"customValueModelGenerator\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (userInput)=\"addItem($event)\"\n [(model)]=\"autocompleteInputValue\"\n (elementsLoaded)=\"onAutocompleteElementsLoaded($event)\"\n>\n <small\n *ngIf=\"!showEmptyListMessage\"\n [attr.id]=\"buildChildId('Help')\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText ? helpText : 'foehn-multiselect-autocomplete.autocomplete.screen-reader.label' | fromDictionary\"\n ></small>\n\n <div\n [id]=\"buildChildId('AlertMessageContainer')\"\n role=\"status\"\n #alertMessageContainer\n >\n <p\n *ngIf=\"showEmptyListMessage\"\n class=\"alert alert-info\"\n tabindex=\"0\"\n >{{'foehn-multiselect-autocomplete.autocomplete.empty-message' | fromDictionary}}</p>\n </div>\n</foehn-autocomplete>\n\n<p\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n {{srAnnouncements}}\n</p>\n\n<div\n role=\"presentation\"\n class=\"selected-list-container d-flex align-content-stretch flex-wrap\"\n [ngClass]=\"!!model && !!model.length ? 'mb-2' : 'mb-0'\"\n #selectedItemsArea\n>\n <ng-container *ngFor=\"let element of model; let index = index; trackBy: trackByFn\">\n <span\n *ngIf=\"!canBeDeleted(index)\"\n class=\"badge badge-pill badge-secondary mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n >\n {{getLabel(element)}}\n </span>\n <button\n *ngIf=\"canBeDeleted(index)\"\n class=\"btn btn-secondary badge badge-pill mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"0\"\n [attr.aria-label]=\"getDeleteButtonAriaLabel(element)\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n (click)=\"removeItem(element)\"\n #selectedElemRef\n >\n {{getLabel(element)}}\n <foehn-icon-times\n aria-hidden=\"true\"\n class=\"ml-2\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n ></foehn-icon-times>\n </button>\n </ng-container>\n</div>\n", styles: ["foehn-autocomplete p.alert:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}.selected-list-container button>.btn,.btn-link{line-height:inherit;padding:0}.selected-list-container .btn{text-transform:none}.selected-list-container span.badge-pill:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}\n"], components: [{ type: i2.FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "customValueModelGenerator"] }, { type: i3.FoehnIconTimesComponent, selector: "foehn-icon-times" }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fromDictionary": i5.SdkDictionaryPipe } });
|
|
178
187
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiselectAutocompleteComponent, decorators: [{
|
|
179
188
|
type: Component,
|
|
180
189
|
args: [{
|
|
@@ -195,9 +204,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImpor
|
|
|
195
204
|
}], alertMessageContainer: [{
|
|
196
205
|
type: ViewChild,
|
|
197
206
|
args: ['alertMessageContainer']
|
|
207
|
+
}], selectedElemRef: [{
|
|
208
|
+
type: ViewChildren,
|
|
209
|
+
args: ['selectedElemRef']
|
|
210
|
+
}], selectedItemsArea: [{
|
|
211
|
+
type: ViewChild,
|
|
212
|
+
args: ['selectedItemsArea']
|
|
198
213
|
}], defaultElementValues: [{
|
|
199
214
|
type: Input
|
|
200
215
|
}], defaultElementValue: [{
|
|
201
216
|
type: Input
|
|
202
217
|
}] } });
|
|
203
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1tdWx0aXNlbGVjdC1hdXRvY29tcGxldGUvZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1tdWx0aXNlbGVjdC1hdXRvY29tcGxldGUvZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsVUFBVSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDaEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7O0FBZXhELE1BQU0sT0FBTyxxQ0FBc0MsU0FBUSwwQkFBMEI7SUFpQ2pGLFlBQVksTUFBYyxFQUFVLGlCQUF1QztRQUN2RSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFEa0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQVAzRSx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0Isb0JBQWUsR0FBRyxFQUFFLENBQUM7SUFRckIsQ0FBQztJQTNCRCxJQUNJLG9CQUFvQixDQUFDLEtBQWdCO1FBQ3JDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENB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ZFJlZiwgSW5wdXQsIE5nWm9uZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb2VobklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4taW5wdXQvZm9laG4taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEZvZWhuQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4tYXV0b2NvbXBsZXRlL2ZvZWhuLWF1dG9jb21wbGV0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2JqZWN0SGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9vYmplY3QuaGVscGVyJztcbmltcG9ydCB7IFNka0RpY3Rpb25hcnlTZXJ2aWNlIH0gZnJvbSAnLi4vc2RrLWRpY3Rpb25hcnkvc2RrLWRpY3Rpb25hcnkuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9mb2Vobi1tdWx0aXNlbGVjdC1hdXRvY29tcGxldGUuY29tcG9uZW50LmNzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGb2VobklucHV0Q29tcG9uZW50LFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9laG5NdWx0aXNlbGVjdEF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb2Vobk11bHRpc2VsZWN0QXV0b2NvbXBsZXRlQ29tcG9uZW50IGV4dGVuZHMgRm9laG5BdXRvY29tcGxldGVDb21wb25lbnQge1xuXG4gICAgQFZpZXdDaGlsZCgnYXV0b2NvbXBsZXRlQ29tcG9uZW50JylcbiAgICBwcml2YXRlIGF1dG9jb21wbGV0ZUNvbXBvbmVudDogRm9laG5BdXRvY29tcGxldGVDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdhbGVydE1lc3NhZ2VDb250YWluZXInKVxuICAgIHByaXZhdGUgYWxlcnRNZXNzYWdlQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KClcbiAgICBzZXQgZGVmYXVsdEVsZW1lbnRWYWx1ZXMoaXRlbXM6IHVua25vd25bXSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRFbGVtZW50VmFsdWVzXyA9IFsuLi5pdGVtc107XG4gICAgICAgIGlmICgoIXRoaXMubW9kZWwgfHwgIXRoaXMubW9kZWwubGVuZ3RoKSAmJiBpdGVtcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVOZ01vZGVsKGl0ZW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBkZWZhdWx0RWxlbWVudFZhbHVlcygpOiB1bmtub3duW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlc187XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgZGVmYXVsdEVsZW1lbnRWYWx1ZShpdGVtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlcyA9IFtpdGVtXTtcbiAgICB9XG5cbiAgICBhdXRvY29tcGxldGVJbnB1dFZhbHVlOiBzdHJpbmc7XG4gICAgc2hvd0VtcHR5TGlzdE1lc3NhZ2UgPSBmYWxzZTtcbiAgICBzckFubm91bmNlbWVudHMgPSAnJztcblxuICAgIHByaXZhdGUgZGVmYXVsdEVsZW1lbnRWYWx1ZXNfOiB1bmtub3duW107XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcml2YXRlIHNyQW5ub3VuY2VtZW50QXV0b0NsZWFyVGltZXI6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKG5nWm9uZTogTmdab25lLCBwcml2YXRlIGRpY3Rpb25hcnlTZXJ2aWNlOiBTZGtEaWN0aW9uYXJ5U2VydmljZSkge1xuICAgICAgICBzdXBlcihuZ1pvbmUpO1xuICAgIH1cblxuICAgIHVwZGF0ZU11bHRpc2VsZWN0QXV0b2NvbXBsZXRlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWxpZFZhbHVlID0gdGhpcy5nZXRWYWxpZFZhbHVlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTmdNb2RlbCh2YWxpZFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVVzZXJJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsaWRWYWx1ZSA9IHRoaXMuZ2V0VmFsaWRWYWx1ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbGlkVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSh2YWxpZFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEl0ZW0oaXRlbTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubW9kZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tb2RlbC5pbmRleE9mKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU11bHRpc2VsZWN0QXV0b2NvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVVc2VySW5wdXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZVN1Z2dlc3Rpb25MaXN0QW5kRm9jdXNBZnRlckFkZGluZ0FuSXRlbSgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlU2NyZWVuUmVhZGVyQW5ub3VuY2VtZW50KGl0ZW0sIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUl0ZW0oaXRlbTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWwuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclVzZXJJbnB1dCh0aGlzLm1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlU3VnZ2VzdGlvbkxpc3RBbmRGb2N1c0FmdGVyUmVtb3ZpbmdBbkl0ZW0oKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlU2NyZWVuUmVhZGVyQW5ub3VuY2VtZW50KGl0ZW0sIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICAgIGdldExhYmVsKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5maW5kRWxlbWVudEJ5TW9kZWxJdGVtKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldExhYmVsKGVsZW0pO1xuICAgIH1cblxuICAgIGNhbkJlRGVsZXRlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlcyB8fCAhdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlcy5pbmNsdWRlcyh0aGlzLm1vZGVsW2luZGV4XSk7XG4gICAgfVxuXG4gICAgb25BdXRvY29tcGxldGVFbGVtZW50c0xvYWRlZChlbGVtZW50czogW10pOiB2b2lkIHtcbiAgICAgICAgLy8gTmVlZCB0byB3YWl0IGZvciBjaGlsZFZpZXcgdG8gYmUgbG9hZGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCEhdGhpcy5hdXRvY29tcGxldGVDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUNvbXBvbmVudC5lbGVtZW50cyA9IHRoaXMuZmlsdGVyQXV0b2NvbXBsZXRlRWxlbWVudHMoZWxlbWVudHMpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5hdXRvY29tcGxldGVDb21wb25lbnQuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FsZXJ0TWVzc2FnZUFuZEhpZGVBdXRvY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldERlbGV0ZUJ1dHRvbkFyaWFMYWJlbChlbGVtZW50OiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0S2V5U3luYygnZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLnNlbGVjdGVkLmRlbGV0ZScsXG4gICAgICAgICAgICB7IGVsZW1lbnRMYWJlbDogdGhpcy5nZXRMYWJlbChlbGVtZW50KSB9KX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEVsZW1lbnRCeU1vZGVsSXRlbShpdGVtOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgICAgIGlmICghIXRoaXMuZWxlbWVudHMgJiYgISF0aGlzLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbVZhbHVlOiBzdHJpbmcgPSB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogdGhpcy5nZXRWYWx1ZShpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmVsZW1lbnRzLmZpbmQoKGVsZW1lbnQ6IHVua25vd24pID0+IHRoaXMuZ2V0VmFsdWUoZWxlbWVudCkgPT09IGl0ZW1WYWx1ZSk7XG4gICAgICAgICAgICBpZiAoISFlbGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWxpZFZhbHVlKCk6IG51bWJlcltdIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLm1vZGVsIHx8ICF0aGlzLm1vZGVsLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJBdXRvY29tcGxldGVFbGVtZW50cyhlbGVtZW50czogW10pOiB1bmtub3duIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IE9iamVjdEhlbHBlci5kZWVwQ29weShlbGVtZW50cyk7XG5cbiAgICAgICAgaWYgKCEhdGhpcy5tb2RlbCAmJiAhIXRoaXMubW9kZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmZvckVhY2goKHNlbGVjdGVkOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZhbHVlXSBvZiBmaWx0ZXJlZEVsZW1lbnRzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5maW5kRWxlbWVudEJ5TW9kZWxJdGVtKHNlbGVjdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdEhlbHBlci5pc0VxdWFsKGVsZW0sIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFuYWdlU3VnZ2VzdGlvbkxpc3RBbmRGb2N1c0FmdGVyQWRkaW5nQW5JdGVtKCk6IHZvaWQge1xuICAgICAgICAvLyBFbXB0eSBhdXRvY29tcGxldGUgaW5wdXRcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVJbnB1dFZhbHVlID0gbnVsbDtcbiAgICAgICAgLy8gUmVtb3ZlIHNlbGVjdGVkIGl0ZW0gZnJvbSBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbiBsaXN0XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQ29tcG9uZW50LmVsZW1lbnRzID0gdGhpcy5maWx0ZXJBdXRvY29tcGxldGVFbGVtZW50cyh0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2Ugc3RpbGwgaGF2ZSBzdWdnZXN0aW9ucyB0byBkaXNwbGF5XG4gICAgICAgIGlmICghdGhpcy5hdXRvY29tcGxldGVDb21wb25lbnQuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dBbGVydE1lc3NhZ2VBbmRIaWRlQXV0b2NvbXBsZXRlKCk7XG4gICAgICAgICAgICAvLyBOZWVkIHNldFRpbWVvdXQgdG8gZW5zdXJlIGFsZXJ0IG1lc3NhZ2UgaXMgb24gdGhlIERPTSBhbmQgY2FuIGJlIGZvY3VzYWJsZVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxlcnRNZXNzYWdlOiBIVE1MRWxlbWVudCA9IHRoaXMuYWxlcnRNZXNzYWdlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigncCcpO1xuICAgICAgICAgICAgICAgIGlmIChhbGVydE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnRNZXNzYWdlLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hbmFnZVN1Z2dlc3Rpb25MaXN0QW5kRm9jdXNBZnRlclJlbW92aW5nQW5JdGVtKCk6IHZvaWQge1xuICAgICAgICAvLyBIaWRlIG1lc3NhZ2Ugc2F5aW5nIG5vIG1vcmUgc3VnZ2VzdGlvbnMgdG8gZGlzcGxheVxuICAgICAgICB0aGlzLnNob3dFbXB0eUxpc3RNZXNzYWdlID0gZmFsc2U7XG4gICAgICAgIC8vIE1hbnVhbGx5IHNob3cgYXV0b2NvbXBsZXRlIGJlY2F1c2UgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHN1Z2dlc3Rpb25zIHRvIGRpc3BsYXlcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVDb21wb25lbnQuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgIC8vIEFkZCBiYWNrIHNlbGVjdGVkIGl0ZW0gdG8gYXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb24gbGlzdFxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUNvbXBvbmVudC5lbGVtZW50cyA9IHRoaXMuZmlsdGVyQXV0b2NvbXBsZXRlRWxlbWVudHModGhpcy5lbGVtZW50cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93QWxlcnRNZXNzYWdlQW5kSGlkZUF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gU2hvdyBhIG1lc3NhZ2UgdG8gdXNlciBpbmRpY2F0aW5nIHRoZXJlIGlzIG5vIG1vcmUgc3VnZ2VzdGlvbnMgdG8gZGlzcGxheVxuICAgICAgICB0aGlzLnNob3dFbXB0eUxpc3RNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgLy8gTWFudWFsbHkgcmVzZXQgYW5kIGhpZGUgYXV0b2NvbXBsZXRlIGJlY2F1c2UgdGhlcmUgaXMgbm8gbW9yZSBzdWdnZXN0aW9ucyB0byBkaXNwbGF5XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSW5wdXRWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQ29tcG9uZW50LmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmhpZGRlbiA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VTY3JlZW5SZWFkZXJBbm5vdW5jZW1lbnQoZWxlbWVudDogdW5rbm93biwgaXNEZWxldGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3JBbm5vdW5jZW1lbnRBdXRvQ2xlYXJUaW1lcik7XG4gICAgICAgIGlmIChpc0RlbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5zckFubm91bmNlbWVudHMgKz0gYCR7dGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXRLZXlTeW5jKCdmb2Vobi1tdWx0aXNlbGVjdC1hdXRvY29tcGxldGUuc3ItYW5ub3VuY2VtZW50LmRlbGV0ZWQnLFxuICAgICAgICAgICAgICAgIHsgZWxlbWVudExhYmVsOiB0aGlzLmdldExhYmVsKGVsZW1lbnQpIH0pfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNyQW5ub3VuY2VtZW50cyArPSBgJHt0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldEtleVN5bmMoJ2ZvZWhuLW11bHRpc2VsZWN0LWF1dG9jb21wbGV0ZS5zci1hbm5vdW5jZW1lbnQuYWRkZWQnLFxuICAgICAgICAgICAgICAgIHsgZWxlbWVudExhYmVsOiB0aGlzLmdldExhYmVsKGVsZW1lbnQpIH0pfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zckFubm91bmNlbWVudEF1dG9DbGVhclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNyQW5ub3VuY2VtZW50cyA9ICcnO1xuICAgICAgICB9LCAxMDAwMCk7XG4gICAgfVxufVxuIiwiPGZvZWhuLWF1dG9jb21wbGV0ZVxuICAgICNhdXRvY29tcGxldGVDb21wb25lbnRcbiAgICBbbmFtZV09XCJuYW1lXCJcbiAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgIFtlbGVtZW50c109XCJlbGVtZW50c1wiXG4gICAgW2VsZW1lbnRzVXJsXT1cImVsZW1lbnRzVXJsXCJcbiAgICBbZWxlbWVudFZhbHVlXT1cImVsZW1lbnRWYWx1ZVwiXG4gICAgW2VsZW1lbnRMYWJlbF09XCJlbGVtZW50TGFiZWxcIlxuICAgIFtlbGVtZW50VmFsdWVJZGVudGl0eV09XCJlbGVtZW50VmFsdWVJZGVudGl0eVwiXG4gICAgW2VsZW1lbnREaXNhYmxlZF09XCJlbGVtZW50RGlzYWJsZWRcIlxuICAgIFthbGxFbGVtZW50RGlzYWJsZWRdPVwiYWxsRWxlbWVudERpc2FibGVkXCJcbiAgICBbZWxlbWVudEdyb3VwXT1cImVsZW1lbnRHcm91cFwiXG4gICAgW2FsbG93Q3VzdG9tVmFsdWVdPVwiZmFsc2VcIlxuICAgIFtzZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnRdPVwic2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50XCJcbiAgICBbY3VzdG9tVmFsdWVNb2RlbEdlbmVyYXRvcl09XCJjdXN0b21WYWx1ZU1vZGVsR2VuZXJhdG9yXCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgKHVzZXJJbnB1dCk9XCJhZGRJdGVtKCRldmVudClcIlxuICAgIFsobW9kZWwpXT1cImF1dG9jb21wbGV0ZUlucHV0VmFsdWVcIlxuICAgIChlbGVtZW50c0xvYWRlZCk9XCJvbkF1dG9jb21wbGV0ZUVsZW1lbnRzTG9hZGVkKCRldmVudClcIlxuPlxuICAgIDxzbWFsbFxuICAgICAgICAqbmdJZj1cIiFzaG93RW1wdHlMaXN0TWVzc2FnZVwiXG4gICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgnSGVscCcpXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1zZWNvbmRhcnlcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cImhlbHBUZXh0ID8gaGVscFRleHQgOiAnZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0ZS5zY3JlZW4tcmVhZGVyLmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICA+PC9zbWFsbD5cblxuICAgIDxkaXZcbiAgICAgICAgW2lkXT1cImJ1aWxkQ2hpbGRJZCgnQWxlcnRNZXNzYWdlQ29udGFpbmVyJylcIlxuICAgICAgICByb2xlPVwic3RhdHVzXCJcbiAgICAgICAgI2FsZXJ0TWVzc2FnZUNvbnRhaW5lclxuICAgID5cbiAgICAgICAgPHBcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0VtcHR5TGlzdE1lc3NhZ2VcIlxuICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgID57eydmb2Vobi1tdWx0aXNlbGVjdC1hdXRvY29tcGxldGUuYXV0b2NvbXBsZXRlLmVtcHR5LW1lc3NhZ2UnIHwgZnJvbURpY3Rpb25hcnl9fTwvcD5cbiAgICA8L2Rpdj5cbjwvZm9laG4tYXV0b2NvbXBsZXRlPlxuXG48cFxuICAgIGNsYXNzPVwic3Itb25seVwiXG4gICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICBhcmlhLWF0b21pYz1cInRydWVcIlxuPlxuICAgIHt7c3JBbm5vdW5jZW1lbnRzfX1cbjwvcD5cblxuPGRpdlxuICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgIGNsYXNzPVwic2VsZWN0ZWQtbGlzdC1jb250YWluZXIgZC1mbGV4IGFsaWduLWNvbnRlbnQtc3RyZXRjaCBmbGV4LXdyYXBcIlxuICAgIFtuZ0NsYXNzXT1cIiEhbW9kZWwgJiYgISFtb2RlbC5sZW5ndGggPyAnbWItMicgOiAnbWItMCdcIlxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgbW9kZWw7IGxldCBpbmRleCA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIWNhbkJlRGVsZXRlZChpbmRleClcIlxuICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiYWRnZS1waWxsIGJhZGdlLXNlY29uZGFyeSBtci0xIG1iLTEgcHktMiBweC0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJidWlsZENoaWxkSWQoJ0xhYmVsJylcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7e2dldExhYmVsKGVsZW1lbnQpfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImNhbkJlRGVsZXRlZChpbmRleClcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBiYWRnZSBiYWRnZS1waWxsIG1yLTEgbWItMSBweS0yIHB4LTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwiMFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldERlbGV0ZUJ1dHRvbkFyaWFMYWJlbChlbGVtZW50KVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImJ1aWxkQ2hpbGRJZCgnTGFiZWwnKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiZ2V0RGVsZXRlQnV0dG9uQXJpYUxhYmVsKGVsZW1lbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVJdGVtKGVsZW1lbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3tnZXRMYWJlbChlbGVtZW50KX19XG4gICAgICAgICAgICA8Zm9laG4taWNvbi10aW1lc1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtbC0yXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0RGVsZXRlQnV0dG9uQXJpYUxhYmVsKGVsZW1lbnQpXCJcbiAgICAgICAgICAgID48L2ZvZWhuLWljb24tdGltZXM+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1tdWx0aXNlbGVjdC1hdXRvY29tcGxldGUvZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1tdWx0aXNlbGVjdC1hdXRvY29tcGxldGUvZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsVUFBVSxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBY3ZDLE1BQU0sT0FBTyxxQ0FBc0MsU0FBUSwwQkFBMEI7SUF3Q2pGLFlBQVksTUFBYyxFQUFVLGlCQUF1QztRQUN2RSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFEa0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQVIzRSx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0Isb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFLSiw4Q0FBeUMsR0FBRyxJQUFJLENBQUM7SUFJbEUsQ0FBQztJQTVCRCxJQUNJLG9CQUFvQixDQUFDLEtBQWdCO1FBQ3JDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEdB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LG1lQ2pCTCw4M0ZBbUZBOzJGRGhFYSxxQ0FBcUM7a0JBWmpELFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGdDQUFnQztvQkFDMUMsV0FBVyxFQUFFLGlEQUFpRDtvQkFDOUQsU0FBUyxFQUFFLENBQUMsZ0RBQWdELENBQUM7b0JBQzdELFNBQVMsRUFBRTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsbUJBQW1COzRCQUM1QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxzQ0FBc0MsQ0FBQzs0QkFDcEUsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0o7aUJBQ0o7Z0lBSVcscUJBQXFCO3NCQUQ1QixTQUFTO3VCQUFDLHVCQUF1QjtnQkFJMUIscUJBQXFCO3NCQUQ1QixTQUFTO3VCQUFDLHVCQUF1QjtnQkFJMUIsZUFBZTtzQkFEdEIsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBSXZCLGlCQUFpQjtzQkFEeEIsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBSTFCLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFhRixtQkFBbUI7c0JBRHRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIElucHV0LCBOZ1pvbmUsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvZWhuSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9mb2Vobi1pbnB1dC9mb2Vobi1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9laG5BdXRvY29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuLi9mb2Vobi1hdXRvY29tcGxldGUvZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPYmplY3RIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL29iamVjdC5oZWxwZXInO1xuaW1wb3J0IHsgU2RrRGljdGlvbmFyeVNlcnZpY2UgfSBmcm9tICcuLi9zZGstZGljdGlvbmFyeS9zZGstZGljdGlvbmFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZvZWhuLW11bHRpc2VsZWN0LWF1dG9jb21wbGV0ZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZvZWhuLW11bHRpc2VsZWN0LWF1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5jc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRm9laG5JbnB1dENvbXBvbmVudCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvZWhuTXVsdGlzZWxlY3RBdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9laG5NdWx0aXNlbGVjdEF1dG9jb21wbGV0ZUNvbXBvbmVudCBleHRlbmRzIEZvZWhuQXV0b2NvbXBsZXRlQ29tcG9uZW50IHtcblxuICAgIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZUNvbXBvbmVudCcpXG4gICAgcHJpdmF0ZSBhdXRvY29tcGxldGVDb21wb25lbnQ6IEZvZWhuQXV0b2NvbXBsZXRlQ29tcG9uZW50O1xuXG4gICAgQFZpZXdDaGlsZCgnYWxlcnRNZXNzYWdlQ29udGFpbmVyJylcbiAgICBwcml2YXRlIGFsZXJ0TWVzc2FnZUNvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3NlbGVjdGVkRWxlbVJlZicpXG4gICAgcHJpdmF0ZSBzZWxlY3RlZEVsZW1SZWY6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkSXRlbXNBcmVhJylcbiAgICBwcml2YXRlIHNlbGVjdGVkSXRlbXNBcmVhOiBFbGVtZW50UmVmO1xuXG4gICAgQElucHV0KClcbiAgICBzZXQgZGVmYXVsdEVsZW1lbnRWYWx1ZXMoaXRlbXM6IHVua25vd25bXSkge1xuICAgICAgICB0aGlzLmRlZmF1bHRFbGVtZW50VmFsdWVzXyA9IFsuLi5pdGVtc107XG4gICAgICAgIGlmICgoIXRoaXMubW9kZWwgfHwgIXRoaXMubW9kZWwubGVuZ3RoKSAmJiBpdGVtcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVOZ01vZGVsKGl0ZW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBkZWZhdWx0RWxlbWVudFZhbHVlcygpOiB1bmtub3duW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlc187XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgZGVmYXVsdEVsZW1lbnRWYWx1ZShpdGVtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlcyA9IFtpdGVtXTtcbiAgICB9XG5cbiAgICBhdXRvY29tcGxldGVJbnB1dFZhbHVlOiBzdHJpbmc7XG4gICAgc2hvd0VtcHR5TGlzdE1lc3NhZ2UgPSBmYWxzZTtcbiAgICBzckFubm91bmNlbWVudHMgPSAnJztcblxuICAgIHByaXZhdGUgZGVmYXVsdEVsZW1lbnRWYWx1ZXNfOiB1bmtub3duW107XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcml2YXRlIHNyQW5ub3VuY2VtZW50Q2xlYXJUaW1lcjogYW55O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgU1JfQU5OT1VOQ0VNRU5UX0NMRUFSX1RJTUVPVVRfSU5URVJWQUxfTVMgPSAyMDAwO1xuXG4gICAgY29uc3RydWN0b3Iobmdab25lOiBOZ1pvbmUsIHByaXZhdGUgZGljdGlvbmFyeVNlcnZpY2U6IFNka0RpY3Rpb25hcnlTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKG5nWm9uZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlTXVsdGlzZWxlY3RBdXRvY29tcGxldGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbGlkVmFsdWUgPSB0aGlzLmdldFZhbGlkVmFsdWUoKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWxpZFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVOZ01vZGVsKHZhbGlkVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlVXNlcklucHV0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWxpZFZhbHVlID0gdGhpcy5nZXRWYWxpZFZhbHVlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKHZhbGlkVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSXRlbShpdGVtOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICghIWl0ZW0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5tb2RlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVsLmluZGV4T2YoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTXVsdGlzZWxlY3RBdXRvY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVVzZXJJbnB1dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlU3VnZ2VzdGlvbkxpc3RBbmRGb2N1c0FmdGVyQWRkaW5nQW5JdGVtKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VTY3JlZW5SZWFkZXJBbm5vdW5jZW1lbnQoaXRlbSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShpdGVtOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tb2RlbC5pbmRleE9mKGl0ZW0pO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXNlcklucHV0KHRoaXMubW9kZWwpO1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VTdWdnZXN0aW9uTGlzdEFuZEZvY3VzQWZ0ZXJSZW1vdmluZ0FuSXRlbSgpO1xuICAgICAgICAgICAgdGhpcy5tYW5hZ2VTY3JlZW5SZWFkZXJBbm5vdW5jZW1lbnQoaXRlbSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSxAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gICAgZ2V0TGFiZWwodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmZpbmRFbGVtZW50QnlNb2RlbEl0ZW0odmFsdWUpO1xuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFiZWwoZWxlbSk7XG4gICAgfVxuXG4gICAgY2FuQmVEZWxldGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICghdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlcyB8fCAhdGhpcy5kZWZhdWx0RWxlbWVudFZhbHVlcy5pbmNsdWRlcyh0aGlzLm1vZGVsW2luZGV4XSkpO1xuICAgIH1cblxuICAgIG9uQXV0b2NvbXBsZXRlRWxlbWVudHNMb2FkZWQoZWxlbWVudHM6IFtdKTogdm9pZCB7XG4gICAgICAgIC8vIE5lZWQgdG8gd2FpdCBmb3IgY2hpbGRWaWV3IHRvIGJlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghIXRoaXMuYXV0b2NvbXBsZXRlQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVDb21wb25lbnQuZWxlbWVudHMgPSB0aGlzLmZpbHRlckF1dG9jb21wbGV0ZUVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuYXV0b2NvbXBsZXRlQ29tcG9uZW50LmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBbGVydE1lc3NhZ2VBbmRIaWRlQXV0b2NvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXREZWxldGVCdXR0b25BcmlhTGFiZWwoZWxlbWVudDogdW5rbm93bik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldEtleVN5bmMoJ2ZvZWhuLW11bHRpc2VsZWN0LWF1dG9jb21wbGV0ZS5zZWxlY3RlZC5kZWxldGUnLFxuICAgICAgICAgICAgeyBlbGVtZW50TGFiZWw6IHRoaXMuZ2V0TGFiZWwoZWxlbWVudCkgfSl9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRFbGVtZW50QnlNb2RlbEl0ZW0oaXRlbTogdW5rbm93bik6IHVua25vd24ge1xuICAgICAgICBpZiAoISF0aGlzLmVsZW1lbnRzICYmICEhdGhpcy5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1WYWx1ZTogdW5rbm93biA9IHR5cGVvZiBpdGVtICE9PSAnb2JqZWN0JyA/IGl0ZW0gOiB0aGlzLmdldFZhbHVlKGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHRoaXMuZWxlbWVudHMuZmluZCgoZWxlbWVudDogdW5rbm93bikgPT4gdGhpcy5nZXRWYWx1ZShlbGVtZW50KSA9PT0gaXRlbVZhbHVlKTtcbiAgICAgICAgICAgIGlmICghIWVsZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZhbGlkVmFsdWUoKTogbnVtYmVyW10gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMubW9kZWwgfHwgIXRoaXMubW9kZWwubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWxfICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlckF1dG9jb21wbGV0ZUVsZW1lbnRzKGVsZW1lbnRzOiBbXSk6IHVua25vd24ge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gT2JqZWN0SGVscGVyLmRlZXBDb3B5KGVsZW1lbnRzKTtcblxuICAgICAgICBpZiAoISF0aGlzLm1vZGVsICYmICEhdGhpcy5tb2RlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZm9yRWFjaCgoc2VsZWN0ZWQ6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIGZpbHRlcmVkRWxlbWVudHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmZpbmRFbGVtZW50QnlNb2RlbEl0ZW0oc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0SGVscGVyLmlzRXF1YWwoZWxlbSwgdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkRWxlbWVudHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VTdWdnZXN0aW9uTGlzdEFuZEZvY3VzQWZ0ZXJBZGRpbmdBbkl0ZW0oKTogdm9pZCB7XG4gICAgICAgIC8vIEVtcHR5IGF1dG9jb21wbGV0ZSBpbnB1dFxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUlucHV0VmFsdWUgPSBudWxsO1xuICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbSBmcm9tIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uIGxpc3RcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVDb21wb25lbnQuZWxlbWVudHMgPSB0aGlzLmZpbHRlckF1dG9jb21wbGV0ZUVsZW1lbnRzKHRoaXMuZWxlbWVudHMpO1xuICAgICAgICAvLyBDaGVjayBpZiB3ZSBzdGlsbCBoYXZlIHN1Z2dlc3Rpb25zIHRvIGRpc3BsYXlcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9jb21wbGV0ZUNvbXBvbmVudC5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0FsZXJ0TWVzc2FnZUFuZEhpZGVBdXRvY29tcGxldGUoKTtcbiAgICAgICAgICAgIC8vIE5lZWQgc2V0VGltZW91dCB0byBlbnN1cmUgYWxlcnQgbWVzc2FnZSBpcyBvbiB0aGUgRE9NIGFuZCBjYW4gYmUgZm9jdXNhYmxlXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGVydE1lc3NhZ2U6IEhUTUxFbGVtZW50ID0gdGhpcy5hbGVydE1lc3NhZ2VDb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdwJyk7XG4gICAgICAgICAgICAgICAgaWYgKGFsZXJ0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBhbGVydE1lc3NhZ2UuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFuYWdlU3VnZ2VzdGlvbkxpc3RBbmRGb2N1c0FmdGVyUmVtb3ZpbmdBbkl0ZW0oKTogdm9pZCB7XG4gICAgICAgIC8vIEhpZGUgbWVzc2FnZSBzYXlpbmcgbm8gbW9yZSBzdWdnZXN0aW9ucyB0byBkaXNwbGF5XG4gICAgICAgIHRoaXMuc2hvd0VtcHR5TGlzdE1lc3NhZ2UgPSBmYWxzZTtcbiAgICAgICAgLy8gTWFudWFsbHkgc2hvdyBhdXRvY29tcGxldGUgYmVjYXVzZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgc3VnZ2VzdGlvbnMgdG8gZGlzcGxheVxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUNvbXBvbmVudC5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgLy8gQWRkIGJhY2sgc2VsZWN0ZWQgaXRlbSB0byBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbiBsaXN0XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQ29tcG9uZW50LmVsZW1lbnRzID0gdGhpcy5maWx0ZXJBdXRvY29tcGxldGVFbGVtZW50cyh0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgLy8gV2hlbiBkZWxldGluZyBhIHNlbGVjdGVkIGl0ZW0sIGNoZWNrIHdlcmUgdG8gc2V0IGZvY3VzIGJhY2sgd2hlbiBubyBtb3JlIGl0ZW1zIHRvIGRlbGV0ZVxuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbVJlZi5jaGFuZ2VzLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbVJlZkFycmF5ID0gWy4uLnRoaXMuc2VsZWN0ZWRFbGVtUmVmLnRvQXJyYXkoKV07XG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkRWxlbVJlZkFycmF5Lmxlbmd0aCAmJiAhIXRoaXMuc2VsZWN0ZWRJdGVtc0FyZWEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNBcmVhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93QWxlcnRNZXNzYWdlQW5kSGlkZUF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gU2hvdyBhIG1lc3NhZ2UgdG8gdXNlciBpbmRpY2F0aW5nIHRoZXJlIGlzIG5vIG1vcmUgc3VnZ2VzdGlvbnMgdG8gZGlzcGxheVxuICAgICAgICB0aGlzLnNob3dFbXB0eUxpc3RNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgLy8gTWFudWFsbHkgcmVzZXQgYW5kIGhpZGUgYXV0b2NvbXBsZXRlIGJlY2F1c2UgdGhlcmUgaXMgbm8gbW9yZSBzdWdnZXN0aW9ucyB0byBkaXNwbGF5XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSW5wdXRWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlQ29tcG9uZW50LmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmhpZGRlbiA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VTY3JlZW5SZWFkZXJBbm5vdW5jZW1lbnQoZWxlbWVudDogdW5rbm93biwgaXNEZWxldGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3JBbm5vdW5jZW1lbnRDbGVhclRpbWVyKTtcbiAgICAgICAgaWYgKGlzRGVsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNyQW5ub3VuY2VtZW50cyArPSBgJHt0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldEtleVN5bmMoJ2ZvZWhuLW11bHRpc2VsZWN0LWF1dG9jb21wbGV0ZS5zci1hbm5vdW5jZW1lbnQuZGVsZXRlZCcsXG4gICAgICAgICAgICAgICAgeyBlbGVtZW50TGFiZWw6IHRoaXMuZ2V0TGFiZWwoZWxlbWVudCkgfSl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3JBbm5vdW5jZW1lbnRzICs9IGAke3RoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0S2V5U3luYygnZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLnNyLWFubm91bmNlbWVudC5hZGRlZCcsXG4gICAgICAgICAgICAgICAgeyBlbGVtZW50TGFiZWw6IHRoaXMuZ2V0TGFiZWwoZWxlbWVudCkgfSl9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNyQW5ub3VuY2VtZW50Q2xlYXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zckFubm91bmNlbWVudHMgPSAnJztcbiAgICAgICAgfSwgdGhpcy5TUl9BTk5PVU5DRU1FTlRfQ0xFQVJfVElNRU9VVF9JTlRFUlZBTF9NUyk7XG4gICAgfVxufVxuIiwiPGZvZWhuLWF1dG9jb21wbGV0ZVxuICAgICNhdXRvY29tcGxldGVDb21wb25lbnRcbiAgICBbbmFtZV09XCJuYW1lXCJcbiAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgIFtlbGVtZW50c109XCJlbGVtZW50c1wiXG4gICAgW2VsZW1lbnRzVXJsXT1cImVsZW1lbnRzVXJsXCJcbiAgICBbZWxlbWVudFZhbHVlXT1cImVsZW1lbnRWYWx1ZVwiXG4gICAgW2VsZW1lbnRMYWJlbF09XCJlbGVtZW50TGFiZWxcIlxuICAgIFtlbGVtZW50VmFsdWVJZGVudGl0eV09XCJlbGVtZW50VmFsdWVJZGVudGl0eVwiXG4gICAgW2VsZW1lbnREaXNhYmxlZF09XCJlbGVtZW50RGlzYWJsZWRcIlxuICAgIFthbGxFbGVtZW50RGlzYWJsZWRdPVwiYWxsRWxlbWVudERpc2FibGVkXCJcbiAgICBbZWxlbWVudEdyb3VwXT1cImVsZW1lbnRHcm91cFwiXG4gICAgW2FsbG93Q3VzdG9tVmFsdWVdPVwiZmFsc2VcIlxuICAgIFtzZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnRdPVwic2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50XCJcbiAgICBbY3VzdG9tVmFsdWVNb2RlbEdlbmVyYXRvcl09XCJjdXN0b21WYWx1ZU1vZGVsR2VuZXJhdG9yXCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgKHVzZXJJbnB1dCk9XCJhZGRJdGVtKCRldmVudClcIlxuICAgIFsobW9kZWwpXT1cImF1dG9jb21wbGV0ZUlucHV0VmFsdWVcIlxuICAgIChlbGVtZW50c0xvYWRlZCk9XCJvbkF1dG9jb21wbGV0ZUVsZW1lbnRzTG9hZGVkKCRldmVudClcIlxuPlxuICAgIDxzbWFsbFxuICAgICAgICAqbmdJZj1cIiFzaG93RW1wdHlMaXN0TWVzc2FnZVwiXG4gICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgnSGVscCcpXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1zZWNvbmRhcnlcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cImhlbHBUZXh0ID8gaGVscFRleHQgOiAnZm9laG4tbXVsdGlzZWxlY3QtYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0ZS5zY3JlZW4tcmVhZGVyLmxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5XCJcbiAgICA+PC9zbWFsbD5cblxuICAgIDxkaXZcbiAgICAgICAgW2lkXT1cImJ1aWxkQ2hpbGRJZCgnQWxlcnRNZXNzYWdlQ29udGFpbmVyJylcIlxuICAgICAgICByb2xlPVwic3RhdHVzXCJcbiAgICAgICAgI2FsZXJ0TWVzc2FnZUNvbnRhaW5lclxuICAgID5cbiAgICAgICAgPHBcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0VtcHR5TGlzdE1lc3NhZ2VcIlxuICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgID57eydmb2Vobi1tdWx0aXNlbGVjdC1hdXRvY29tcGxldGUuYXV0b2NvbXBsZXRlLmVtcHR5LW1lc3NhZ2UnIHwgZnJvbURpY3Rpb25hcnl9fTwvcD5cbiAgICA8L2Rpdj5cbjwvZm9laG4tYXV0b2NvbXBsZXRlPlxuXG48cFxuICAgIGNsYXNzPVwic3Itb25seVwiXG4gICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICBhcmlhLWF0b21pYz1cInRydWVcIlxuPlxuICAgIHt7c3JBbm5vdW5jZW1lbnRzfX1cbjwvcD5cblxuPGRpdlxuICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgIGNsYXNzPVwic2VsZWN0ZWQtbGlzdC1jb250YWluZXIgZC1mbGV4IGFsaWduLWNvbnRlbnQtc3RyZXRjaCBmbGV4LXdyYXBcIlxuICAgIFtuZ0NsYXNzXT1cIiEhbW9kZWwgJiYgISFtb2RlbC5sZW5ndGggPyAnbWItMicgOiAnbWItMCdcIlxuICAgICNzZWxlY3RlZEl0ZW1zQXJlYVxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgbW9kZWw7IGxldCBpbmRleCA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIWNhbkJlRGVsZXRlZChpbmRleClcIlxuICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiYWRnZS1waWxsIGJhZGdlLXNlY29uZGFyeSBtci0xIG1iLTEgcHktMiBweC0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiYnVpbGRDaGlsZElkKCdMYWJlbCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3tnZXRMYWJlbChlbGVtZW50KX19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJjYW5CZURlbGV0ZWQoaW5kZXgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYmFkZ2UgYmFkZ2UtcGlsbCBtci0xIG1iLTEgcHktMiBweC0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXREZWxldGVCdXR0b25BcmlhTGFiZWwoZWxlbWVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJidWlsZENoaWxkSWQoJ0xhYmVsJylcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImdldERlbGV0ZUJ1dHRvbkFyaWFMYWJlbChlbGVtZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlSXRlbShlbGVtZW50KVwiXG4gICAgICAgICAgICAjc2VsZWN0ZWRFbGVtUmVmXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7Z2V0TGFiZWwoZWxlbWVudCl9fVxuICAgICAgICAgICAgPGZvZWhuLWljb24tdGltZXNcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldERlbGV0ZUJ1dHRvbkFyaWFMYWJlbChlbGVtZW50KVwiXG4gICAgICAgICAgICA+PC9mb2Vobi1pY29uLXRpbWVzPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19
|
|
@@ -7819,6 +7819,7 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
|
|
|
7819
7819
|
this.dictionaryService = dictionaryService;
|
|
7820
7820
|
this.showEmptyListMessage = false;
|
|
7821
7821
|
this.srAnnouncements = '';
|
|
7822
|
+
this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL_MS = 2000;
|
|
7822
7823
|
}
|
|
7823
7824
|
set defaultElementValues(items) {
|
|
7824
7825
|
this.defaultElementValues_ = [...items];
|
|
@@ -7877,7 +7878,7 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
|
|
|
7877
7878
|
return super.getLabel(elem);
|
|
7878
7879
|
}
|
|
7879
7880
|
canBeDeleted(index) {
|
|
7880
|
-
return !this.defaultElementValues || !this.defaultElementValues.includes(this.model[index]);
|
|
7881
|
+
return !this.disabled && (!this.defaultElementValues || !this.defaultElementValues.includes(this.model[index]));
|
|
7881
7882
|
}
|
|
7882
7883
|
onAutocompleteElementsLoaded(elements) {
|
|
7883
7884
|
// Need to wait for childView to be loaded
|
|
@@ -7895,7 +7896,7 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
|
|
|
7895
7896
|
}
|
|
7896
7897
|
findElementByModelItem(item) {
|
|
7897
7898
|
if (!!this.elements && !!this.elements.length) {
|
|
7898
|
-
const itemValue = typeof item
|
|
7899
|
+
const itemValue = typeof item !== 'object' ? item : this.getValue(item);
|
|
7899
7900
|
const elem = this.elements.find((element) => this.getValue(element) === itemValue);
|
|
7900
7901
|
if (!!elem) {
|
|
7901
7902
|
return elem;
|
|
@@ -7951,6 +7952,13 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
|
|
|
7951
7952
|
this.autocompleteComponent.inputElement.nativeElement.hidden = false;
|
|
7952
7953
|
// Add back selected item to autocomplete suggestion list
|
|
7953
7954
|
this.autocompleteComponent.elements = this.filterAutocompleteElements(this.elements);
|
|
7955
|
+
// When deleting a selected item, check were to set focus back when no more items to delete
|
|
7956
|
+
this.selectedElemRef.changes.pipe(first()).subscribe(() => {
|
|
7957
|
+
const selectedElemRefArray = [...this.selectedElemRef.toArray()];
|
|
7958
|
+
if (!selectedElemRefArray.length && !!this.selectedItemsArea) {
|
|
7959
|
+
this.selectedItemsArea.nativeElement.focus();
|
|
7960
|
+
}
|
|
7961
|
+
});
|
|
7954
7962
|
}
|
|
7955
7963
|
showAlertMessageAndHideAutocomplete() {
|
|
7956
7964
|
// Show a message to user indicating there is no more suggestions to display
|
|
@@ -7960,16 +7968,16 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
|
|
|
7960
7968
|
this.autocompleteComponent.inputElement.nativeElement.hidden = true;
|
|
7961
7969
|
}
|
|
7962
7970
|
manageScreenReaderAnnouncement(element, isDelete) {
|
|
7963
|
-
clearTimeout(this.
|
|
7971
|
+
clearTimeout(this.srAnnouncementClearTimer);
|
|
7964
7972
|
if (isDelete) {
|
|
7965
7973
|
this.srAnnouncements += `${this.dictionaryService.getKeySync('foehn-multiselect-autocomplete.sr-announcement.deleted', { elementLabel: this.getLabel(element) })}`;
|
|
7966
7974
|
}
|
|
7967
7975
|
else {
|
|
7968
7976
|
this.srAnnouncements += `${this.dictionaryService.getKeySync('foehn-multiselect-autocomplete.sr-announcement.added', { elementLabel: this.getLabel(element) })}`;
|
|
7969
7977
|
}
|
|
7970
|
-
this.
|
|
7978
|
+
this.srAnnouncementClearTimer = setTimeout(() => {
|
|
7971
7979
|
this.srAnnouncements = '';
|
|
7972
|
-
},
|
|
7980
|
+
}, this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL_MS);
|
|
7973
7981
|
}
|
|
7974
7982
|
}
|
|
7975
7983
|
FoehnMultiselectAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiselectAutocompleteComponent, deps: [{ token: i0.NgZone }, { token: SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
|
|
@@ -7979,7 +7987,7 @@ FoehnMultiselectAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVer
|
|
|
7979
7987
|
useExisting: forwardRef(() => FoehnMultiselectAutocompleteComponent),
|
|
7980
7988
|
multi: true
|
|
7981
7989
|
}
|
|
7982
|
-
], viewQueries: [{ propertyName: "autocompleteComponent", first: true, predicate: ["autocompleteComponent"], descendants: true }, { propertyName: "alertMessageContainer", first: true, predicate: ["alertMessageContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<foehn-autocomplete\n #autocompleteComponent\n [name]=\"name\"\n [label]=\"label\"\n [elements]=\"elements\"\n [elementsUrl]=\"elementsUrl\"\n [elementValue]=\"elementValue\"\n [elementLabel]=\"elementLabel\"\n [elementValueIdentity]=\"elementValueIdentity\"\n [elementDisabled]=\"elementDisabled\"\n [allElementDisabled]=\"allElementDisabled\"\n [elementGroup]=\"elementGroup\"\n [allowCustomValue]=\"false\"\n [searchValueMinCharsCount]=\"searchValueMinCharsCount\"\n [customValueModelGenerator]=\"customValueModelGenerator\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (userInput)=\"addItem($event)\"\n [(model)]=\"autocompleteInputValue\"\n (elementsLoaded)=\"onAutocompleteElementsLoaded($event)\"\n>\n <small\n *ngIf=\"!showEmptyListMessage\"\n [attr.id]=\"buildChildId('Help')\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText ? helpText : 'foehn-multiselect-autocomplete.autocomplete.screen-reader.label' | fromDictionary\"\n ></small>\n\n <div\n [id]=\"buildChildId('AlertMessageContainer')\"\n role=\"status\"\n #alertMessageContainer\n >\n <p\n *ngIf=\"showEmptyListMessage\"\n class=\"alert alert-info\"\n tabindex=\"0\"\n >{{'foehn-multiselect-autocomplete.autocomplete.empty-message' | fromDictionary}}</p>\n </div>\n</foehn-autocomplete>\n\n<p\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n {{srAnnouncements}}\n</p>\n\n<div\n role=\"presentation\"\n class=\"selected-list-container d-flex align-content-stretch flex-wrap\"\n [ngClass]=\"!!model && !!model.length ? 'mb-2' : 'mb-0'\"\n>\n <ng-container *ngFor=\"let element of model; let index = index; trackBy: trackByFn\">\n <span\n *ngIf=\"!canBeDeleted(index)\"\n class=\"badge badge-pill badge-secondary mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"0\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n >\n {{getLabel(element)}}\n </span>\n <button\n *ngIf=\"canBeDeleted(index)\"\n class=\"btn btn-secondary badge badge-pill mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"0\"\n [attr.aria-label]=\"getDeleteButtonAriaLabel(element)\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n (click)=\"removeItem(element)\"\n >\n {{getLabel(element)}}\n <foehn-icon-times\n aria-hidden=\"true\"\n class=\"ml-2\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n ></foehn-icon-times>\n </button>\n </ng-container>\n</div>\n", styles: ["foehn-autocomplete p.alert:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}.selected-list-container button>.btn,.btn-link{line-height:inherit;padding:0}.selected-list-container .btn{text-transform:none}.selected-list-container span.badge-pill:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}\n"], components: [{ type: FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "customValueModelGenerator"] }, { type: FoehnIconTimesComponent, selector: "foehn-icon-times" }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fromDictionary": SdkDictionaryPipe } });
|
|
7990
|
+
], viewQueries: [{ propertyName: "autocompleteComponent", first: true, predicate: ["autocompleteComponent"], descendants: true }, { propertyName: "alertMessageContainer", first: true, predicate: ["alertMessageContainer"], descendants: true }, { propertyName: "selectedItemsArea", first: true, predicate: ["selectedItemsArea"], descendants: true }, { propertyName: "selectedElemRef", predicate: ["selectedElemRef"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<foehn-autocomplete\n #autocompleteComponent\n [name]=\"name\"\n [label]=\"label\"\n [elements]=\"elements\"\n [elementsUrl]=\"elementsUrl\"\n [elementValue]=\"elementValue\"\n [elementLabel]=\"elementLabel\"\n [elementValueIdentity]=\"elementValueIdentity\"\n [elementDisabled]=\"elementDisabled\"\n [allElementDisabled]=\"allElementDisabled\"\n [elementGroup]=\"elementGroup\"\n [allowCustomValue]=\"false\"\n [searchValueMinCharsCount]=\"searchValueMinCharsCount\"\n [customValueModelGenerator]=\"customValueModelGenerator\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (userInput)=\"addItem($event)\"\n [(model)]=\"autocompleteInputValue\"\n (elementsLoaded)=\"onAutocompleteElementsLoaded($event)\"\n>\n <small\n *ngIf=\"!showEmptyListMessage\"\n [attr.id]=\"buildChildId('Help')\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText ? helpText : 'foehn-multiselect-autocomplete.autocomplete.screen-reader.label' | fromDictionary\"\n ></small>\n\n <div\n [id]=\"buildChildId('AlertMessageContainer')\"\n role=\"status\"\n #alertMessageContainer\n >\n <p\n *ngIf=\"showEmptyListMessage\"\n class=\"alert alert-info\"\n tabindex=\"0\"\n >{{'foehn-multiselect-autocomplete.autocomplete.empty-message' | fromDictionary}}</p>\n </div>\n</foehn-autocomplete>\n\n<p\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n {{srAnnouncements}}\n</p>\n\n<div\n role=\"presentation\"\n class=\"selected-list-container d-flex align-content-stretch flex-wrap\"\n [ngClass]=\"!!model && !!model.length ? 'mb-2' : 'mb-0'\"\n #selectedItemsArea\n>\n <ng-container *ngFor=\"let element of model; let index = index; trackBy: trackByFn\">\n <span\n *ngIf=\"!canBeDeleted(index)\"\n class=\"badge badge-pill badge-secondary mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n >\n {{getLabel(element)}}\n </span>\n <button\n *ngIf=\"canBeDeleted(index)\"\n class=\"btn btn-secondary badge badge-pill mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"0\"\n [attr.aria-label]=\"getDeleteButtonAriaLabel(element)\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n (click)=\"removeItem(element)\"\n #selectedElemRef\n >\n {{getLabel(element)}}\n <foehn-icon-times\n aria-hidden=\"true\"\n class=\"ml-2\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n ></foehn-icon-times>\n </button>\n </ng-container>\n</div>\n", styles: ["foehn-autocomplete p.alert:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}.selected-list-container button>.btn,.btn-link{line-height:inherit;padding:0}.selected-list-container .btn{text-transform:none}.selected-list-container span.badge-pill:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}\n"], components: [{ type: FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "customValueModelGenerator"] }, { type: FoehnIconTimesComponent, selector: "foehn-icon-times" }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fromDictionary": SdkDictionaryPipe } });
|
|
7983
7991
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiselectAutocompleteComponent, decorators: [{
|
|
7984
7992
|
type: Component,
|
|
7985
7993
|
args: [{
|
|
@@ -8000,6 +8008,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImpor
|
|
|
8000
8008
|
}], alertMessageContainer: [{
|
|
8001
8009
|
type: ViewChild,
|
|
8002
8010
|
args: ['alertMessageContainer']
|
|
8011
|
+
}], selectedElemRef: [{
|
|
8012
|
+
type: ViewChildren,
|
|
8013
|
+
args: ['selectedElemRef']
|
|
8014
|
+
}], selectedItemsArea: [{
|
|
8015
|
+
type: ViewChild,
|
|
8016
|
+
args: ['selectedItemsArea']
|
|
8003
8017
|
}], defaultElementValues: [{
|
|
8004
8018
|
type: Input
|
|
8005
8019
|
}], defaultElementValue: [{
|