turbogui-angular 15.1.2 → 15.2.0
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/esm2022/main/controller/dialog.service.mjs +5 -4
- package/esm2022/main/controller/turbo-api-caller.service.mjs +1 -1
- package/esm2022/main/controller/views.service.mjs +66 -21
- package/esm2022/main/view/animations/fade.animation.mjs +4 -4
- package/esm2022/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.mjs +24 -3
- package/fesm2022/turbogui-angular.mjs +95 -29
- package/fesm2022/turbogui-angular.mjs.map +1 -1
- package/main/controller/dialog.service.d.ts +4 -3
- package/main/controller/dialog.service.d.ts.map +1 -1
- package/main/controller/views.service.d.ts +14 -5
- package/main/controller/views.service.d.ts.map +1 -1
- package/main/view/animations/fade.animation.d.ts.map +1 -1
- package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.d.ts +9 -0
- package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -20,10 +20,10 @@ export class FadeAnimationClass {
|
|
|
20
20
|
* @param enter The time and easing that we want to use for the enter state
|
|
21
21
|
* @param leave The time and easing that we want to use for the leave state
|
|
22
22
|
*/
|
|
23
|
-
static getTrigger(triggerName, enter = '1s ease', leave = '
|
|
23
|
+
static getTrigger(triggerName, enter = '1s ease', leave = '300ms ease') {
|
|
24
24
|
return trigger(triggerName, [
|
|
25
|
-
transition('
|
|
26
|
-
transition('
|
|
25
|
+
transition('void => *', [style({ opacity: 0 }), animate(enter, style({ opacity: 1 }))]),
|
|
26
|
+
transition('* => void', [animate(leave, style({ opacity: 0 }))])
|
|
27
27
|
]);
|
|
28
28
|
}
|
|
29
29
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FadeAnimationClass, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
@@ -32,4 +32,4 @@ export class FadeAnimationClass {
|
|
|
32
32
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FadeAnimationClass, decorators: [{
|
|
33
33
|
type: Injectable
|
|
34
34
|
}] });
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFkZS5hbmltYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL3ZpZXcvYW5pbWF0aW9ucy9mYWRlLmFuaW1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBRzFFOztHQUVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUUzQjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQW1CLEVBQUUsS0FBSyxHQUFHLFNBQVMsRUFBRSxLQUFLLEdBQUcsWUFBWTtRQUUxRSxPQUFPLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckYsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlELENBQUMsQ0FBQztJQUNuQyxDQUFDOzhHQWZRLGtCQUFrQjtrSEFBbEIsa0JBQWtCOzsyRkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFR1cmJvR1VJIGlzIEEgbGlicmFyeSB0aGF0IGhlbHBzIHdpdGggdGhlIG1vc3QgY29tbW9uIGFuZCBnZW5lcmljIFVJIGVsZW1lbnRzIGFuZCBmdW5jdGlvbmFsaXRpZXNcclxuICpcclxuICogV2Vic2l0ZSA6IC0+IGh0dHA6Ly93d3cudHVyYm9ndWkub3JnXHJcbiAqIExpY2Vuc2UgOiAtPiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIExpY2Vuc2UgVXJsIDogLT4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqIENvcHlSaWdodCA6IC0+IENvcHlyaWdodCAyMDE4IEVkZXJ0b25lIEFkdmFuZGVkIFNvbHV0aW9ucy4gaHR0cHM6Ly93d3cuZWRlcnRvbmUuY29tXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0cmlnZ2VyLCBhbmltYXRlLCB0cmFuc2l0aW9uLCBzdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBGYWRlIGFuaW1hdGlvbnNcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZhZGVBbmltYXRpb25DbGFzcyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBjdXN0b20gdHJpZ2dlciB0byBjcmVhdGUgZmFkZSBhbmltYXRpb25zIHdoZW4gY29tcG9uZW50cyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBhcHBsaWNhdGlvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0cmlnZ2VyTmFtZSBUaGUgbmFtZSBmb3IgdGhlIHRyaWdnZXIgd2Ugd2FudCB0byBjcmVhdGVcclxuICAgICAqIEBwYXJhbSBlbnRlciBUaGUgdGltZSBhbmQgZWFzaW5nIHRoYXQgd2Ugd2FudCB0byB1c2UgZm9yIHRoZSBlbnRlciBzdGF0ZVxyXG4gICAgICogQHBhcmFtIGxlYXZlIFRoZSB0aW1lIGFuZCBlYXNpbmcgdGhhdCB3ZSB3YW50IHRvIHVzZSBmb3IgdGhlIGxlYXZlIHN0YXRlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRUcmlnZ2VyKHRyaWdnZXJOYW1lOiBzdHJpbmcsIGVudGVyID0gJzFzIGVhc2UnLCBsZWF2ZSA9ICczMDBtcyBlYXNlJykge1xyXG5cclxuICAgICAgICByZXR1cm4gdHJpZ2dlcih0cmlnZ2VyTmFtZSwgW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW3N0eWxlKHtvcGFjaXR5OiAwfSksIGFuaW1hdGUoZW50ZXIsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSldKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIFthbmltYXRlKGxlYXZlLCBzdHlsZSh7b3BhY2l0eTogMH0pKV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -50,6 +50,10 @@ export class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
50
50
|
* It may be filtered or not depending on this component setup and the user input
|
|
51
51
|
*/
|
|
52
52
|
this.filteredOptions = [];
|
|
53
|
+
/**
|
|
54
|
+
* Stores the number of options that are currently visible to the user
|
|
55
|
+
*/
|
|
56
|
+
this.filteredOptionsCount = 0;
|
|
53
57
|
/**
|
|
54
58
|
* Contains the original list of elements that are provided to be listed on this component before
|
|
55
59
|
* being possibly filtered. It is only used as a backup, not shown to the user
|
|
@@ -76,6 +80,7 @@ export class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
76
80
|
throw new Error('DialogSingleSelectionListComponent expects one or more options');
|
|
77
81
|
}
|
|
78
82
|
this.originalOptions = data.options;
|
|
83
|
+
this.filteredOptionsCount = this.originalOptions.length;
|
|
79
84
|
for (let option of this.originalOptions) {
|
|
80
85
|
this.filteredOptions.push(option);
|
|
81
86
|
this.originalOptionsFullTextSearch.push(StringUtils.formatForFullTextSearch(option));
|
|
@@ -87,17 +92,33 @@ export class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
87
92
|
getListItemsContainerMaxheight() {
|
|
88
93
|
return (this.browserService.getWindowHeight() * 0.6) + 'px';
|
|
89
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* If the user presses enter key and there's only one element filtered in the list, we will close this dialog
|
|
97
|
+
* setting that element as the selected.
|
|
98
|
+
*/
|
|
99
|
+
onIntroKeyPress() {
|
|
100
|
+
if (this.filteredOptionsCount === 1) {
|
|
101
|
+
for (let i = 0; i < this.originalOptionsFullTextSearch.length; i++) {
|
|
102
|
+
if (this.filteredOptions[i] !== '') {
|
|
103
|
+
this.closeDialog(i);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
90
109
|
/**
|
|
91
110
|
* When the user types a value on the input element to filter the list, this method will perform
|
|
92
111
|
* that filtering and refresh the list
|
|
93
112
|
*/
|
|
94
113
|
onSearchChange(input) {
|
|
95
114
|
this.selectedItemIndex = -1;
|
|
115
|
+
this.filteredOptionsCount = 0;
|
|
96
116
|
let inputValue = StringUtils.formatForFullTextSearch(input.value);
|
|
97
117
|
for (let i = 0; i < this.originalOptionsFullTextSearch.length; i++) {
|
|
98
118
|
if (inputValue === '' ||
|
|
99
119
|
this.originalOptionsFullTextSearch[i].indexOf(inputValue) >= 0) {
|
|
100
120
|
this.filteredOptions[i] = this.originalOptions[i];
|
|
121
|
+
this.filteredOptionsCount++;
|
|
101
122
|
}
|
|
102
123
|
else {
|
|
103
124
|
this.filteredOptions[i] = '';
|
|
@@ -105,13 +126,13 @@ export class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
105
126
|
}
|
|
106
127
|
}
|
|
107
128
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DialogSingleSelectionListComponent, deps: [{ token: i0.ElementRef }, { token: i1.MatDialogRef }, { token: i2.BrowserService }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
108
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: DialogSingleSelectionListComponent, isStandalone: true, selector: "tg-dialog-single-selection-list", providers: [], usesInheritance: true, ngImport: i0, template: "<h3>\r\n {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 && !stringUtils.isEmpty(data.texts[1])\">\r\n {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 && !stringUtils.isEmpty(data.texts[2])\"\r\n class=\"searchItemInputContainer\">\r\n \r\n <mat-label>{{data.texts[2]}}</mat-label>\r\n <input matInput autoFocusOnDisplay\r\n (input)=\"onSearchChange($event.target)\">\r\n \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n <div class=\"listItemContainer\"\r\n [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n \r\n <p *ngIf=\"item !== ''\">\r\n {{item}}\r\n </p>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n [disabled]=\"selectedItemIndex < 0\"\r\n (click)=\"closeDialog(selectedItemIndex)\"\r\n *ngIf=\"data.texts.length > 3\">\r\n\r\n {{data.texts[3]}}\r\n \r\n</button>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: TurboGuiAngularModule }, { kind: "directive", type: i6.AutoFocusOnDisplayDirective, selector: "[autoFocusOnDisplay]" }] }); }
|
|
129
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: DialogSingleSelectionListComponent, isStandalone: true, selector: "tg-dialog-single-selection-list", providers: [], usesInheritance: true, ngImport: i0, template: "<h3>\r\n {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 && !stringUtils.isEmpty(data.texts[1])\">\r\n {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 && !stringUtils.isEmpty(data.texts[2])\"\r\n class=\"searchItemInputContainer\">\r\n \r\n <mat-label>{{data.texts[2]}}</mat-label>\r\n <input matInput autoFocusOnDisplay\r\n (keyup.enter)=\"onIntroKeyPress()\"\r\n (input)=\"onSearchChange($event.target)\">\r\n \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n <div class=\"listItemContainer\"\r\n [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n \r\n <p *ngIf=\"item !== ''\">\r\n {{item}}\r\n </p>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n [disabled]=\"selectedItemIndex < 0\"\r\n (click)=\"closeDialog(selectedItemIndex)\"\r\n *ngIf=\"data.texts.length > 3\">\r\n\r\n {{data.texts[3]}}\r\n \r\n</button>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: TurboGuiAngularModule }, { kind: "directive", type: i6.AutoFocusOnDisplayDirective, selector: "[autoFocusOnDisplay]" }] }); }
|
|
109
130
|
}
|
|
110
131
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DialogSingleSelectionListComponent, decorators: [{
|
|
111
132
|
type: Component,
|
|
112
|
-
args: [{ selector: 'tg-dialog-single-selection-list', standalone: true, imports: [CommonModule, MatInputModule, MatFormFieldModule, TurboGuiAngularModule], providers: [], template: "<h3>\r\n {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 && !stringUtils.isEmpty(data.texts[1])\">\r\n {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 && !stringUtils.isEmpty(data.texts[2])\"\r\n class=\"searchItemInputContainer\">\r\n \r\n <mat-label>{{data.texts[2]}}</mat-label>\r\n <input matInput autoFocusOnDisplay\r\n (input)=\"onSearchChange($event.target)\">\r\n \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n <div class=\"listItemContainer\"\r\n [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n \r\n <p *ngIf=\"item !== ''\">\r\n {{item}}\r\n </p>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n [disabled]=\"selectedItemIndex < 0\"\r\n (click)=\"closeDialog(selectedItemIndex)\"\r\n *ngIf=\"data.texts.length > 3\">\r\n\r\n {{data.texts[3]}}\r\n \r\n</button>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"] }]
|
|
133
|
+
args: [{ selector: 'tg-dialog-single-selection-list', standalone: true, imports: [CommonModule, MatInputModule, MatFormFieldModule, TurboGuiAngularModule], providers: [], template: "<h3>\r\n {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 && !stringUtils.isEmpty(data.texts[1])\">\r\n {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 && !stringUtils.isEmpty(data.texts[2])\"\r\n class=\"searchItemInputContainer\">\r\n \r\n <mat-label>{{data.texts[2]}}</mat-label>\r\n <input matInput autoFocusOnDisplay\r\n (keyup.enter)=\"onIntroKeyPress()\"\r\n (input)=\"onSearchChange($event.target)\">\r\n \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n <div class=\"listItemContainer\"\r\n [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n \r\n <p *ngIf=\"item !== ''\">\r\n {{item}}\r\n </p>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n [disabled]=\"selectedItemIndex < 0\"\r\n (click)=\"closeDialog(selectedItemIndex)\"\r\n *ngIf=\"data.texts.length > 3\">\r\n\r\n {{data.texts[3]}}\r\n \r\n</button>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"] }]
|
|
113
134
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.MatDialogRef }, { type: i2.BrowserService }, { type: undefined, decorators: [{
|
|
114
135
|
type: Inject,
|
|
115
136
|
args: [MAT_DIALOG_DATA]
|
|
116
137
|
}] }] });
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL3ZpZXcvY29tcG9uZW50cy9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0L2RpYWxvZy1zaW5nbGUtc2VsZWN0aW9uLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi92aWV3L2NvbXBvbmVudHMvZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7Ozs7OztBQUd2Rjs7Ozs7Ozs7Ozs7R0FXRztBQVdILE1BQU0sT0FBTyxrQ0FBbUMsU0FBUSxtQkFBbUI7YUFHdkQsc0JBQWlCLEdBQUcsb0NBQW9DLEFBQXZDLENBQXdDO0lBbUN6RSxZQUFtQixVQUFzQixF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SSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRGlhbG9nQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2RpYWxvZy1iYXNlL2RpYWxvZy1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJyb3dzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29udHJvbGxlci9icm93c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdHJpbmdVdGlscyB9IGZyb20gJ3R1cmJvY29tbW9ucy10cyc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgVHVyYm9HdWlBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvbW9kdWxlcy90dXJib2d1aS1hbmd1bGFyLm1vZHVsZSc7XG5cclxuXHJcbi8qKlxyXG4gKiBBIGRpYWxvZyBjb21wb25lbnQgd2hpY2ggYWxsb3dzIHVzIHRvIHNlbGVjdCBvbmUgc2luZ2xlIGl0ZW0gZnJvbSBhIGxpc3QuIFRoZSBlbGVtZW50cyBvbiB0aGF0IGxpc3QgYXJlIGRpc3BsYXllZCBvbiBhIHRhYmxlXHJcbiAqIHdoaWNoIG1heSBzaG93IGEgc2Nyb2xsIGlmIG5lY2Vzc2FyeSB3aGVuIHRoZXJlIGFyZSBtYW55IGVsZW1lbnRzIG9uIHRoZSBsaXN0LlxyXG4gKiBcclxuICogSXQgYWxzbyBhbGxvd3MgdXMgdG8gZmlsdGVyIGluc2lkZSB0aGUgbGlzdCB3aXRoIGEgY3VzdG9tIHRleHQgdGhhdCB3ZSBjYW4gdHlwZSBpbnRvIGEgc2VhcmNoIGlucHV0LCB3aGljaCBpcyBvcHRpb25hbC5cclxuICpcclxuICogdGV4dHMgcGFyYW1ldGVyIG11c3QgY29udGFpbiB0aGUgdGl0bGUsIHRoZSBkZXNjcmlwdGlvbiAob3B0aW9uYWwpLCB0aGUgZmlsdGVyIGlucHV0IHRpdGxlIChvcHRpb25hbCksIGFuZCB0aGUgc3VibWl0IGJ1dHRvbiBjYXB0aW9uLlxyXG4gKiBJZiB0aGF0IGNhcHRpb24gaXMgbm90IHByb3ZpZGVkLCB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBwZXJmb3JtZWQgb25jZSB1c2VyIGNsaWNrcyBvbiBhbiBlbGVtZW50IG9uIHRoZSBsaXN0LiBPdGhlcndpc2UsIFxyXG4gKiB0aGUgZWxlbWVudCB3aWxsIGJlIHNlbGVjdGVkIG9uIHRoZSBsaXN0IGFuZCB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIG9uY2UgdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBzdWJtaXQgYnV0dG9uLlxyXG4gKlxyXG4gKiBvcHRpb25zIHBhcmFtZXRlciBtdXN0IGNvbnRhaW4gdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciAgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBcdHNlbGVjdG9yOiAndGctZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdCcsXHJcbiAgXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIFR1cmJvR3VpQW5ndWxhck1vZHVsZV0sXHJcblx0cHJvdmlkZXJzOiBbXSxcclxuICBcdHRlbXBsYXRlVXJsOiAnLi9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0LmNvbXBvbmVudC5odG1sJyxcclxuICBcdHN0eWxlVXJsczogWycuL2RpYWxvZy1zaW5nbGUtc2VsZWN0aW9uLWxpc3QuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dTaW5nbGVTZWxlY3Rpb25MaXN0Q29tcG9uZW50IGV4dGVuZHMgRGlhbG9nQmFzZUNvbXBvbmVudCB7XHJcbiAgICBcclxuICAgIFxyXG4gICAgc3RhdGljIHJlYWRvbmx5IERJQUxPR19DTEFTU19OQU1FID0gJ0RpYWxvZ1NpbmdsZVNlbGVjdGlvbkxpc3RDb21wb25lbnQnO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRGVjbGFyZSBhIHJlZmVyZW5jZSB0byB0aGUgc3RyaW5nIHV0aWxzIGNsYXNzIHNvIGl0IGNhbiBiZSB1c2VkIG9uIHRoZSBodG1sIHBhcnRcclxuICAgICAqL1xyXG4gICAgc3RyaW5nVXRpbHMgPSBTdHJpbmdVdGlscztcclxuICAgIFxyXG4gICAgLyoqIFxyXG4gICAgICogQ29udGFpbnMgdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCB3aWxsIGJlIGRpcmVjdGx5IHNob3duIHRvIHRoZSB1c2VyIGF0IHRoZSBjb21wb25lbnQgbGlzdC5cclxuICAgICAqIEl0IG1heSBiZSBmaWx0ZXJlZCBvciBub3QgZGVwZW5kaW5nIG9uIHRoaXMgY29tcG9uZW50IHNldHVwIGFuZCB0aGUgdXNlciBpbnB1dFxyXG4gICAgICovXHJcbiAgICBmaWx0ZXJlZE9wdGlvbnM6c3RyaW5nW10gPSBbXTtcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENvbnRhaW5zIHRoZSBvcmlnaW5hbCBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHByb3ZpZGVkIHRvIGJlIGxpc3RlZCBvbiB0aGlzIGNvbXBvbmVudCBiZWZvcmVcclxuICAgICAqIGJlaW5nIHBvc3NpYmx5IGZpbHRlcmVkLiBJdCBpcyBvbmx5IHVzZWQgYXMgYSBiYWNrdXAsIG5vdCBzaG93biB0byB0aGUgdXNlclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9yaWdpbmFsT3B0aW9uczpzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNhbWUgbGlzdCBhcyB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBidXQgcHJvY2Vzc2VkIGZvciBhIGJldHRlciB0ZXh0IHNlYXJjaC5cclxuICAgICAqIEl0IHdpbGwgYmUgdXNlZCB0byBwZXJmb3JtIHRoZSBzZWFyY2gsIGJ1dCBub3Qgc2hvd24gdG8gdGhlIHVzZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2g6c3RyaW5nW10gPSBbXTtcclxuICAgICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyB0aGUgaW5kZXggZm9yIHRoZSBlbGVtZW50IHRoYXQncyBiZWVuIHNlbGVjdGVkIGJ5IHRoZSB1c2VyXHJcbiAgICAgKi9cclxuICAgIHNlbGVjdGVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIFx0XHRcdHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEaWFsb2dCYXNlQ29tcG9uZW50PixcclxuICAgICAgICAgICAgICAgIHB1YmxpYyBicm93c2VyU2VydmljZTogQnJvd3NlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSkge1xyXG5cclxuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBkaWFsb2dSZWYpO1xyXG5cclxuICAgICAgICBpZiAoZGF0YS50ZXh0cy5sZW5ndGggPCAxKSB7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpYWxvZ1NpbmdsZVNlbGVjdGlvbkxpc3RDb21wb25lbnQgZXhwZWN0cyA0IHRleHRzOiBUaGUgdGl0bGUsIHRoZSBkZXNjcmlwdGlvbiAob3B0aW9uYWwpLCB0aGUgZmlsdGVyIGlucHV0IHRpdGxlIChvcHRpb25hbCksIGFuZCB0aGUgc3VibWl0IGJ1dHRvbiBjYXB0aW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChkYXRhLm9wdGlvbnMubGVuZ3RoIDwgMSkge1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaWFsb2dTaW5nbGVTZWxlY3Rpb25MaXN0Q29tcG9uZW50IGV4cGVjdHMgb25lIG9yIG1vcmUgb3B0aW9ucycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IGRhdGEub3B0aW9ucztcclxuICAgICAgICBcclxuICAgICAgICBmb3IobGV0IG9wdGlvbiBvZiB0aGlzLm9yaWdpbmFsT3B0aW9ucyl7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucy5wdXNoKG9wdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2gucHVzaChTdHJpbmdVdGlscy5mb3JtYXRGb3JGdWxsVGV4dFNlYXJjaChvcHRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdG8gY2FsY3VsYXRlIHRoZSBtYXggcG9zc2libGUgaGVpZ2h0IHRoYXQgdGhlIGxpc3QgaXRlbXMgY29udGFpbmVyIGlzIGFsbG93ZWQgdG8gaGF2ZVxyXG4gICAgICovXHJcbiAgICBnZXRMaXN0SXRlbXNDb250YWluZXJNYXhoZWlnaHQoKXtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gKHRoaXMuYnJvd3NlclNlcnZpY2UuZ2V0V2luZG93SGVpZ2h0KCkgKiAwLjYpICsgJ3B4JztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRoZSB1c2VyIHR5cGVzIGEgdmFsdWUgb24gdGhlIGlucHV0IGVsZW1lbnQgdG8gZmlsdGVyIHRoZSBsaXN0LCB0aGlzIG1ldGhvZCB3aWxsIHBlcmZvcm1cclxuICAgICAqIHRoYXQgZmlsdGVyaW5nIGFuZCByZWZyZXNoIHRoZSBsaXN0XHJcbiAgICAgKi9cclxuICAgIG9uU2VhcmNoQ2hhbmdlKGlucHV0OkhUTUxJbnB1dEVsZW1lbnQpe1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICAgICBcclxuICAgICAgICBsZXQgaW5wdXRWYWx1ZSA9IFN0cmluZ1V0aWxzLmZvcm1hdEZvckZ1bGxUZXh0U2VhcmNoKGlucHV0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9yaWdpbmFsT3B0aW9uc0Z1bGxUZXh0U2VhcmNoLmxlbmd0aDsgaSsrKXtcclxuXHJcbiAgICAgICAgICAgIGlmKGlucHV0VmFsdWUgPT09ICcnIHx8XHJcbiAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2hbaV0uaW5kZXhPZihpbnB1dFZhbHVlKSA+PSAwKXtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tpXSA9IHRoaXMub3JpZ2luYWxPcHRpb25zW2ldO1xyXG5cclxuICAgICAgICAgICAgfWVsc2V7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNbaV0gPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdyZWF0bHkgaW1wcm92ZSBuZ0ZvciBwZXJmb3JtYW5jZSB3aXRoIGFycmF5cyBvZiBwcmltaXRpdmUgdmFsdWVzLiBJdCB0ZWxscyB0aGUgcmVmcmVzaFxyXG4gICAgICogZnVuY3Rpb24gdG8gd29yayBieSBpbmRleCBpbnN0ZWFkIG9mIGJ5IHZhbHVlLiBUaGUgY2hhbmdlIGluIHBlcmZvcm1hbmNlIHdoZW4gcmVmcmVzaGluZyB0aGUgbGlzdCBpcyBtYXNzaXZlLiBcclxuICAgICAqL1xyXG4gICAgdHJhY2tCeUZuID0gKGluZGV4OiBudW1iZXIsIF92YWx1ZTogc3RyaW5nKSA9PiBpbmRleDtcclxufVxyXG4iLCI8aDM+XHJcbiAgICB7e2RhdGEudGV4dHNbMF19fVxyXG48L2gzPlxyXG5cclxuPCEtLSBIZXJlIGdvZXMgdGhlIGRpYWxvZyBzdWJ0aXRsZS4gTGVhdmUgaXQgYmxhbmsgaWYgeW91IGRvbid0IG5lZWQgaXQgLS0+XHJcbjxwICpuZ0lmPVwiZGF0YS50ZXh0cy5sZW5ndGggPiAxICZhbXA7JmFtcDsgIXN0cmluZ1V0aWxzLmlzRW1wdHkoZGF0YS50ZXh0c1sxXSlcIj5cclxuICAgIHt7ZGF0YS50ZXh0c1sxXX19XHJcbjwvcD5cclxuXHJcbjxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImRhdGEudGV4dHMubGVuZ3RoID4gMiAmYW1wOyZhbXA7ICFzdHJpbmdVdGlscy5pc0VtcHR5KGRhdGEudGV4dHNbMl0pXCJcclxuICAgIGNsYXNzPVwic2VhcmNoSXRlbUlucHV0Q29udGFpbmVyXCI+XHJcbiAgICBcclxuICAgIDxtYXQtbGFiZWw+e3tkYXRhLnRleHRzWzJdfX08L21hdC1sYWJlbD5cclxuICAgIDxpbnB1dCBtYXRJbnB1dCBhdXRvRm9jdXNPbkRpc3BsYXlcclxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50LnRhcmdldClcIj5cclxuICAgICAgICBcclxuPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbjwhLS0gaGVyZSBnb2VzIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBzaG93biB0byB0aGUgdXNlciAtLT5cclxuPGRpdiBjbGFzcz1cImxpc3RJdGVtc0NvbnRhaW5lclwiXHJcbiAgICBbc3R5bGUubWF4LWhlaWdodF09XCJnZXRMaXN0SXRlbXNDb250YWluZXJNYXhoZWlnaHQoKVwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJsaXN0SXRlbUNvbnRhaW5lclwiXHJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2VsZWN0ZWRJdGVtSW5kZXggPT09IGkgPyAnIzkwZDFmZmFkJyA6IChpICUgMiA9PT0gMCA/ICdpbml0aWFsJyA6ICcjMDAwMDAwMDknKVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRPcHRpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxyXG4gICAgICAgIChjbGljayk9XCJkYXRhLnRleHRzLmxlbmd0aCA8IDQgPyBjbG9zZURpYWxvZyhpKSA6IHNlbGVjdGVkSXRlbUluZGV4ID0gaVwiPlxyXG4gICAgXHJcbiAgICAgICAgPHAgKm5nSWY9XCJpdGVtICE9PSAnJ1wiPlxyXG4gICAgICAgICAgICB7e2l0ZW19fVxyXG4gICAgICAgIDwvcD5cclxuICAgIFxyXG4gICAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCJcclxuICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZEl0ZW1JbmRleCA8IDBcIlxyXG4gICAgKGNsaWNrKT1cImNsb3NlRGlhbG9nKHNlbGVjdGVkSXRlbUluZGV4KVwiXHJcbiAgICAqbmdJZj1cImRhdGEudGV4dHMubGVuZ3RoID4gM1wiPlxyXG5cclxuICAgIHt7ZGF0YS50ZXh0c1szXX19XHJcbiAgICBcclxuPC9idXR0b24+Il19
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL3ZpZXcvY29tcG9uZW50cy9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0L2RpYWxvZy1zaW5nbGUtc2VsZWN0aW9uLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi92aWV3L2NvbXBvbmVudHMvZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7Ozs7OztBQUd2Rjs7Ozs7Ozs7Ozs7R0FXRztBQVdILE1BQU0sT0FBTyxrQ0FBbUMsU0FBUSxtQkFBbUI7YUFHdkQsc0JBQWlCLEdBQUcsb0NBQW9DLEFBQXZDLENBQXdDO0lBeUN6RSxZQUFtQixVQUFzQixFQUMvQixTQUE0QyxFQUNuQyxjQUE4QixFQUNMLElBQVM7UUFFakQsS0FBSyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUxkLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDL0IsY0FBUyxHQUFULFNBQVMsQ0FBbUM7UUFDbkMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ0wsU0FBSSxHQUFKLElBQUksQ0FBSztRQXpDckQ7O1dBRUc7UUFDSCxnQkFBVyxHQUFHLFdBQVcsQ0FBQztRQUUxQjs7O1dBR0c7UUFDSCxvQkFBZSxHQUFZLEVBQUUsQ0FBQztRQUc5Qjs7V0FFRztRQUNILHlCQUFvQixHQUFHLENBQUMsQ0FBQztRQUd6Qjs7O1dBR0c7UUFDSyxvQkFBZSxHQUFZLEVBQUUsQ0FBQztRQUd0Qzs7O1dBR0c7UUFDSyxrQ0FBNkIsR0FBWSxFQUFFLENBQUM7UUFHcEQ7O1dBRUc7UUFDSCxzQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQXVGdkI7OztXQUdHO1FBQ0gsY0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1FBakZqRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUV2QixNQUFNLElBQUksS0FBSyxDQUFDLDZKQUE2SixDQUFDLENBQUM7U0FDbEw7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUV6QixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7U0FDckY7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBRXhELEtBQUksSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBQztZQUVuQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3hGO0lBQ0wsQ0FBQztJQUdEOztPQUVHO0lBQ0gsOEJBQThCO1FBRTFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNoRSxDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsZUFBZTtRQUVYLElBQUcsSUFBSSxDQUFDLG9CQUFvQixLQUFLLENBQUMsRUFBQztZQUUvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBQztnQkFFL0QsSUFBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBQztvQkFFOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFcEIsT0FBTztpQkFDVjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLEtBQXNCO1FBRWpDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBRTlCLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUM7WUFFL0QsSUFBRyxVQUFVLEtBQUssRUFBRTtnQkFDakIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUM7Z0JBRTlELElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLG9CQUFvQixFQUFHLENBQUM7YUFFaEM7aUJBQUk7Z0JBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDaEM7U0FDSjtJQUNMLENBQUM7OEdBOUhRLGtDQUFrQyxzR0ErQ3ZCLGVBQWU7a0dBL0MxQixrQ0FBa0MsOEVBTm5DLEVBQUUsaURDcENkLGs5Q0EyQ1Msa2FEUkUsWUFBWSwrUEFBRSxjQUFjLHNuQkFBRSxrQkFBa0IsOEJBQUUscUJBQXFCOzsyRkFPckUsa0NBQWtDO2tCQVY5QyxTQUFTOytCQUNHLGlDQUFpQyxjQUMvQixJQUFJLFdBQ1QsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLGFBQ3ZFLEVBQUU7OzBCQXFERyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogTGljZW5zZSBVcmwgOiAtPiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICogQ29weVJpZ2h0IDogLT4gQ29weXJpZ2h0IDIwMTggRWRlcnRvbmUgQWR2YW5kZWQgU29sdXRpb25zLiBodHRwczovL3d3dy5lZGVydG9uZS5jb21cclxuICovXHJcblxyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IERpYWxvZ0Jhc2VDb21wb25lbnQgfSBmcm9tICcuLi9kaWFsb2ctYmFzZS9kaWFsb2ctYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCcm93c2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRyb2xsZXIvYnJvd3Nlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RyaW5nVXRpbHMgfSBmcm9tICd0dXJib2NvbW1vbnMtdHMnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IFR1cmJvR3VpQW5ndWxhck1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL21vZGVsL21vZHVsZXMvdHVyYm9ndWktYW5ndWxhci5tb2R1bGUnO1xuXHJcblxyXG4vKipcclxuICogQSBkaWFsb2cgY29tcG9uZW50IHdoaWNoIGFsbG93cyB1cyB0byBzZWxlY3Qgb25lIHNpbmdsZSBpdGVtIGZyb20gYSBsaXN0LiBUaGUgZWxlbWVudHMgb24gdGhhdCBsaXN0IGFyZSBkaXNwbGF5ZWQgb24gYSB0YWJsZVxyXG4gKiB3aGljaCBtYXkgc2hvdyBhIHNjcm9sbCBpZiBuZWNlc3Nhcnkgd2hlbiB0aGVyZSBhcmUgbWFueSBlbGVtZW50cyBvbiB0aGUgbGlzdC5cclxuICogXHJcbiAqIEl0IGFsc28gYWxsb3dzIHVzIHRvIGZpbHRlciBpbnNpZGUgdGhlIGxpc3Qgd2l0aCBhIGN1c3RvbSB0ZXh0IHRoYXQgd2UgY2FuIHR5cGUgaW50byBhIHNlYXJjaCBpbnB1dCwgd2hpY2ggaXMgb3B0aW9uYWwuXHJcbiAqXHJcbiAqIHRleHRzIHBhcmFtZXRlciBtdXN0IGNvbnRhaW4gdGhlIHRpdGxlLCB0aGUgZGVzY3JpcHRpb24gKG9wdGlvbmFsKSwgdGhlIGZpbHRlciBpbnB1dCB0aXRsZSAob3B0aW9uYWwpLCBhbmQgdGhlIHN1Ym1pdCBidXR0b24gY2FwdGlvbi5cclxuICogSWYgdGhhdCBjYXB0aW9uIGlzIG5vdCBwcm92aWRlZCwgdGhlIHNlbGVjdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcGVyZm9ybWVkIG9uY2UgdXNlciBjbGlja3Mgb24gYW4gZWxlbWVudCBvbiB0aGUgbGlzdC4gT3RoZXJ3aXNlLCBcclxuICogdGhlIGVsZW1lbnQgd2lsbCBiZSBzZWxlY3RlZCBvbiB0aGUgbGlzdCBhbmQgdGhlIHNlbGVjdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBvbmNlIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgc3VibWl0IGJ1dHRvbi5cclxuICpcclxuICogb3B0aW9ucyBwYXJhbWV0ZXIgbXVzdCBjb250YWluIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgIFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgXHRzZWxlY3RvcjogJ3RnLWRpYWxvZy1zaW5nbGUtc2VsZWN0aW9uLWxpc3QnLFxyXG4gIFx0c3RhbmRhbG9uZTogdHJ1ZSxcclxuXHRpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBUdXJib0d1aUFuZ3VsYXJNb2R1bGVdLFxyXG5cdHByb3ZpZGVyczogW10sXHJcbiAgXHR0ZW1wbGF0ZVVybDogJy4vZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgXHRzdHlsZVVybHM6IFsnLi9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRGlhbG9nU2luZ2xlU2VsZWN0aW9uTGlzdENvbXBvbmVudCBleHRlbmRzIERpYWxvZ0Jhc2VDb21wb25lbnQge1xyXG4gICAgXHJcbiAgICBcclxuICAgIHN0YXRpYyByZWFkb25seSBESUFMT0dfQ0xBU1NfTkFNRSA9ICdEaWFsb2dTaW5nbGVTZWxlY3Rpb25MaXN0Q29tcG9uZW50JztcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIERlY2xhcmUgYSByZWZlcmVuY2UgdG8gdGhlIHN0cmluZyB1dGlscyBjbGFzcyBzbyBpdCBjYW4gYmUgdXNlZCBvbiB0aGUgaHRtbCBwYXJ0XHJcbiAgICAgKi9cclxuICAgIHN0cmluZ1V0aWxzID0gU3RyaW5nVXRpbHM7XHJcbiAgICBcclxuICAgIC8qKiBcclxuICAgICAqIENvbnRhaW5zIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBkaXJlY3RseSBzaG93biB0byB0aGUgdXNlciBhdCB0aGUgY29tcG9uZW50IGxpc3QuXHJcbiAgICAgKiBJdCBtYXkgYmUgZmlsdGVyZWQgb3Igbm90IGRlcGVuZGluZyBvbiB0aGlzIGNvbXBvbmVudCBzZXR1cCBhbmQgdGhlIHVzZXIgaW5wdXRcclxuICAgICAqL1xyXG4gICAgZmlsdGVyZWRPcHRpb25zOnN0cmluZ1tdID0gW107XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9yZXMgdGhlIG51bWJlciBvZiBvcHRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyXHJcbiAgICAgKi9cclxuICAgIGZpbHRlcmVkT3B0aW9uc0NvdW50ID0gMDtcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENvbnRhaW5zIHRoZSBvcmlnaW5hbCBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHByb3ZpZGVkIHRvIGJlIGxpc3RlZCBvbiB0aGlzIGNvbXBvbmVudCBiZWZvcmVcclxuICAgICAqIGJlaW5nIHBvc3NpYmx5IGZpbHRlcmVkLiBJdCBpcyBvbmx5IHVzZWQgYXMgYSBiYWNrdXAsIG5vdCBzaG93biB0byB0aGUgdXNlclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9yaWdpbmFsT3B0aW9uczpzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNhbWUgbGlzdCBhcyB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBidXQgcHJvY2Vzc2VkIGZvciBhIGJldHRlciB0ZXh0IHNlYXJjaC5cclxuICAgICAqIEl0IHdpbGwgYmUgdXNlZCB0byBwZXJmb3JtIHRoZSBzZWFyY2gsIGJ1dCBub3Qgc2hvd24gdG8gdGhlIHVzZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2g6c3RyaW5nW10gPSBbXTtcclxuICAgICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyB0aGUgaW5kZXggZm9yIHRoZSBlbGVtZW50IHRoYXQncyBiZWVuIHNlbGVjdGVkIGJ5IHRoZSB1c2VyXHJcbiAgICAgKi9cclxuICAgIHNlbGVjdGVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBcdFx0XHRwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RGlhbG9nQmFzZUNvbXBvbmVudD4sXHJcbiAgICAgICAgICAgICAgICBwdWJsaWMgYnJvd3NlclNlcnZpY2U6IEJyb3dzZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnkpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgZGlhbG9nUmVmKTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGEudGV4dHMubGVuZ3RoIDwgMSkge1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaWFsb2dTaW5nbGVTZWxlY3Rpb25MaXN0Q29tcG9uZW50IGV4cGVjdHMgNCB0ZXh0czogVGhlIHRpdGxlLCB0aGUgZGVzY3JpcHRpb24gKG9wdGlvbmFsKSwgdGhlIGZpbHRlciBpbnB1dCB0aXRsZSAob3B0aW9uYWwpLCBhbmQgdGhlIHN1Ym1pdCBidXR0b24gY2FwdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAoZGF0YS5vcHRpb25zLmxlbmd0aCA8IDEpIHtcclxuXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGlhbG9nU2luZ2xlU2VsZWN0aW9uTGlzdENvbXBvbmVudCBleHBlY3RzIG9uZSBvciBtb3JlIG9wdGlvbnMnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbE9wdGlvbnMgPSBkYXRhLm9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCA9IHRoaXMub3JpZ2luYWxPcHRpb25zLmxlbmd0aDtcclxuICAgICAgICBcclxuICAgICAgICBmb3IobGV0IG9wdGlvbiBvZiB0aGlzLm9yaWdpbmFsT3B0aW9ucyl7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucy5wdXNoKG9wdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2gucHVzaChTdHJpbmdVdGlscy5mb3JtYXRGb3JGdWxsVGV4dFNlYXJjaChvcHRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdG8gY2FsY3VsYXRlIHRoZSBtYXggcG9zc2libGUgaGVpZ2h0IHRoYXQgdGhlIGxpc3QgaXRlbXMgY29udGFpbmVyIGlzIGFsbG93ZWQgdG8gaGF2ZVxyXG4gICAgICovXHJcbiAgICBnZXRMaXN0SXRlbXNDb250YWluZXJNYXhoZWlnaHQoKXtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gKHRoaXMuYnJvd3NlclNlcnZpY2UuZ2V0V2luZG93SGVpZ2h0KCkgKiAwLjYpICsgJ3B4JztcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSB1c2VyIHByZXNzZXMgZW50ZXIga2V5IGFuZCB0aGVyZSdzIG9ubHkgb25lIGVsZW1lbnQgZmlsdGVyZWQgaW4gdGhlIGxpc3QsIHdlIHdpbGwgY2xvc2UgdGhpcyBkaWFsb2dcclxuICAgICAqIHNldHRpbmcgdGhhdCBlbGVtZW50IGFzIHRoZSBzZWxlY3RlZC5cclxuICAgICAqL1xyXG4gICAgb25JbnRyb0tleVByZXNzKCl7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuZmlsdGVyZWRPcHRpb25zQ291bnQgPT09IDEpe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9yaWdpbmFsT3B0aW9uc0Z1bGxUZXh0U2VhcmNoLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5maWx0ZXJlZE9wdGlvbnNbaV0gIT09ICcnKXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRoZSB1c2VyIHR5cGVzIGEgdmFsdWUgb24gdGhlIGlucHV0IGVsZW1lbnQgdG8gZmlsdGVyIHRoZSBsaXN0LCB0aGlzIG1ldGhvZCB3aWxsIHBlcmZvcm1cclxuICAgICAqIHRoYXQgZmlsdGVyaW5nIGFuZCByZWZyZXNoIHRoZSBsaXN0XHJcbiAgICAgKi9cclxuICAgIG9uU2VhcmNoQ2hhbmdlKGlucHV0OkhUTUxJbnB1dEVsZW1lbnQpe1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCA9IDA7XHJcbiAgICAgICBcclxuICAgICAgICBsZXQgaW5wdXRWYWx1ZSA9IFN0cmluZ1V0aWxzLmZvcm1hdEZvckZ1bGxUZXh0U2VhcmNoKGlucHV0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9yaWdpbmFsT3B0aW9uc0Z1bGxUZXh0U2VhcmNoLmxlbmd0aDsgaSsrKXtcclxuXHJcbiAgICAgICAgICAgIGlmKGlucHV0VmFsdWUgPT09ICcnIHx8XHJcbiAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2hbaV0uaW5kZXhPZihpbnB1dFZhbHVlKSA+PSAwKXtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tpXSA9IHRoaXMub3JpZ2luYWxPcHRpb25zW2ldO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNDb3VudCArKztcclxuXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zW2ldID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBncmVhdGx5IGltcHJvdmUgbmdGb3IgcGVyZm9ybWFuY2Ugd2l0aCBhcnJheXMgb2YgcHJpbWl0aXZlIHZhbHVlcy4gSXQgdGVsbHMgdGhlIHJlZnJlc2hcclxuICAgICAqIGZ1bmN0aW9uIHRvIHdvcmsgYnkgaW5kZXggaW5zdGVhZCBvZiBieSB2YWx1ZS4gVGhlIGNoYW5nZSBpbiBwZXJmb3JtYW5jZSB3aGVuIHJlZnJlc2hpbmcgdGhlIGxpc3QgaXMgbWFzc2l2ZS4gXHJcbiAgICAgKi9cclxuICAgIHRyYWNrQnlGbiA9IChpbmRleDogbnVtYmVyLCBfdmFsdWU6IHN0cmluZykgPT4gaW5kZXg7XHJcbn1cclxuIiwiPGgzPlxyXG4gICAge3tkYXRhLnRleHRzWzBdfX1cclxuPC9oMz5cclxuXHJcbjwhLS0gSGVyZSBnb2VzIHRoZSBkaWFsb2cgc3VidGl0bGUuIExlYXZlIGl0IGJsYW5rIGlmIHlvdSBkb24ndCBuZWVkIGl0IC0tPlxyXG48cCAqbmdJZj1cImRhdGEudGV4dHMubGVuZ3RoID4gMSAmYW1wOyZhbXA7ICFzdHJpbmdVdGlscy5pc0VtcHR5KGRhdGEudGV4dHNbMV0pXCI+XHJcbiAgICB7e2RhdGEudGV4dHNbMV19fVxyXG48L3A+XHJcblxyXG48bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJkYXRhLnRleHRzLmxlbmd0aCA+IDIgJmFtcDsmYW1wOyAhc3RyaW5nVXRpbHMuaXNFbXB0eShkYXRhLnRleHRzWzJdKVwiXHJcbiAgICBjbGFzcz1cInNlYXJjaEl0ZW1JbnB1dENvbnRhaW5lclwiPlxyXG4gICAgXHJcbiAgICA8bWF0LWxhYmVsPnt7ZGF0YS50ZXh0c1syXX19PC9tYXQtbGFiZWw+XHJcbiAgICA8aW5wdXQgbWF0SW5wdXQgYXV0b0ZvY3VzT25EaXNwbGF5XHJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uSW50cm9LZXlQcmVzcygpXCJcclxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50LnRhcmdldClcIj5cclxuICAgICAgICBcclxuPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbjwhLS0gaGVyZSBnb2VzIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBzaG93biB0byB0aGUgdXNlciAtLT5cclxuPGRpdiBjbGFzcz1cImxpc3RJdGVtc0NvbnRhaW5lclwiXHJcbiAgICBbc3R5bGUubWF4LWhlaWdodF09XCJnZXRMaXN0SXRlbXNDb250YWluZXJNYXhoZWlnaHQoKVwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJsaXN0SXRlbUNvbnRhaW5lclwiXHJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2VsZWN0ZWRJdGVtSW5kZXggPT09IGkgPyAnIzkwZDFmZmFkJyA6IChpICUgMiA9PT0gMCA/ICdpbml0aWFsJyA6ICcjMDAwMDAwMDknKVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRPcHRpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxyXG4gICAgICAgIChjbGljayk9XCJkYXRhLnRleHRzLmxlbmd0aCA8IDQgPyBjbG9zZURpYWxvZyhpKSA6IHNlbGVjdGVkSXRlbUluZGV4ID0gaVwiPlxyXG4gICAgXHJcbiAgICAgICAgPHAgKm5nSWY9XCJpdGVtICE9PSAnJ1wiPlxyXG4gICAgICAgICAgICB7e2l0ZW19fVxyXG4gICAgICAgIDwvcD5cclxuICAgIFxyXG4gICAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCJcclxuICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZEl0ZW1JbmRleCA8IDBcIlxyXG4gICAgKGNsaWNrKT1cImNsb3NlRGlhbG9nKHNlbGVjdGVkSXRlbUluZGV4KVwiXHJcbiAgICAqbmdJZj1cImRhdGEudGV4dHMubGVuZ3RoID4gM1wiPlxyXG5cclxuICAgIHt7ZGF0YS50ZXh0c1szXX19XHJcbiAgICBcclxuPC9idXR0b24+Il19
|
|
@@ -8,6 +8,7 @@ import * as i3 from '@angular/material/button';
|
|
|
8
8
|
import { MatButtonModule } from '@angular/material/button';
|
|
9
9
|
import * as i2 from '@angular/common';
|
|
10
10
|
import { CommonModule } from '@angular/common';
|
|
11
|
+
import * as i1$2 from '@angular/animations';
|
|
11
12
|
import { style, animate, transition, trigger } from '@angular/animations';
|
|
12
13
|
import { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';
|
|
13
14
|
import * as i2$1 from '@angular/material/datepicker';
|
|
@@ -500,10 +501,10 @@ class FadeAnimationClass {
|
|
|
500
501
|
* @param enter The time and easing that we want to use for the enter state
|
|
501
502
|
* @param leave The time and easing that we want to use for the leave state
|
|
502
503
|
*/
|
|
503
|
-
static getTrigger(triggerName, enter = '1s ease', leave = '
|
|
504
|
+
static getTrigger(triggerName, enter = '1s ease', leave = '300ms ease') {
|
|
504
505
|
return trigger(triggerName, [
|
|
505
|
-
transition('
|
|
506
|
-
transition('
|
|
506
|
+
transition('void => *', [style({ opacity: 0 }), animate(enter, style({ opacity: 1 }))]),
|
|
507
|
+
transition('* => void', [animate(leave, style({ opacity: 0 }))])
|
|
507
508
|
]);
|
|
508
509
|
}
|
|
509
510
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: FadeAnimationClass, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
@@ -693,9 +694,10 @@ class DialogService extends SingletoneStrictClass {
|
|
|
693
694
|
* Change the application visual appearance so the user perceives that the application is
|
|
694
695
|
* currently busy. While modal busy state is enabled, no user input is possible neither via
|
|
695
696
|
* keyboard, mouse or touch. Use this state when performing server requests or operations that
|
|
696
|
-
* must block the user interaction with the application.
|
|
697
|
+
* must block the user interaction with the application. To allow user interaction again, you must
|
|
698
|
+
* call removeModalBusyState()
|
|
697
699
|
*
|
|
698
|
-
*
|
|
700
|
+
* Notice: We can modify the busy state visual component that is shown by this method. To do it, we must
|
|
699
701
|
* set this.customBusyStateComponentClass property with our own custom busy state component class. (We can do it at
|
|
700
702
|
* our main application component constructor for example). Our custom component must extend the
|
|
701
703
|
* BusyStateBaseComponent one to add its own visual appearance.
|
|
@@ -723,7 +725,7 @@ class DialogService extends SingletoneStrictClass {
|
|
|
723
725
|
return this._isShowingBusyState;
|
|
724
726
|
}
|
|
725
727
|
/**
|
|
726
|
-
*
|
|
728
|
+
* Cancel the application busy state and restore it back to normal so user interaction is allowed again
|
|
727
729
|
*/
|
|
728
730
|
removeModalBusyState() {
|
|
729
731
|
if (!this._isEnabled || !this._isShowingBusyState) {
|
|
@@ -1512,9 +1514,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImpor
|
|
|
1512
1514
|
* Manages adding, removing and manipulating the application views
|
|
1513
1515
|
*/
|
|
1514
1516
|
class ViewsService extends SingletoneStrictClass {
|
|
1515
|
-
constructor(
|
|
1517
|
+
constructor(animationBuilder) {
|
|
1516
1518
|
super(ViewsService);
|
|
1517
|
-
this.
|
|
1519
|
+
this.animationBuilder = animationBuilder;
|
|
1518
1520
|
/**
|
|
1519
1521
|
* See getter method for docs
|
|
1520
1522
|
*/
|
|
@@ -1523,6 +1525,10 @@ class ViewsService extends SingletoneStrictClass {
|
|
|
1523
1525
|
* See setter method for docs
|
|
1524
1526
|
*/
|
|
1525
1527
|
this._viewContainerRef = null;
|
|
1528
|
+
/**
|
|
1529
|
+
* Contains the reference to the currently loaded view component
|
|
1530
|
+
*/
|
|
1531
|
+
this._currentComponentRef = null;
|
|
1526
1532
|
}
|
|
1527
1533
|
/**
|
|
1528
1534
|
* Tells if there's any view currently loaded on the application views container
|
|
@@ -1552,32 +1558,71 @@ class ViewsService extends SingletoneStrictClass {
|
|
|
1552
1558
|
*
|
|
1553
1559
|
* @return The instance of the newly added and created view.
|
|
1554
1560
|
*/
|
|
1555
|
-
pushView(view) {
|
|
1561
|
+
async pushView(view) {
|
|
1562
|
+
this.verifyViewsContainerExist();
|
|
1563
|
+
// If the loaded view is the same as the specified one, we will do nothing
|
|
1564
|
+
if (this._loadedViewClass === view) {
|
|
1565
|
+
return this._currentComponentRef;
|
|
1566
|
+
}
|
|
1556
1567
|
// If a view is already loaded, we will unload it first
|
|
1557
1568
|
if (this._loadedViewClass !== null) {
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
const
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1569
|
+
await this.removeCurrentView();
|
|
1570
|
+
}
|
|
1571
|
+
// Create the new view
|
|
1572
|
+
const newComponentRef = this._viewContainerRef.createComponent(view);
|
|
1573
|
+
newComponentRef.changeDetectorRef.detectChanges();
|
|
1574
|
+
// Set initial opacity to 0
|
|
1575
|
+
newComponentRef.location.nativeElement.style.opacity = '0';
|
|
1576
|
+
// Fade in the new view
|
|
1577
|
+
const fadeInPlayer = this.animationBuilder.build([
|
|
1578
|
+
style({ opacity: 0 }),
|
|
1579
|
+
animate('300ms ease', style({ opacity: 1 }))
|
|
1580
|
+
]).create(newComponentRef.location.nativeElement);
|
|
1581
|
+
await new Promise((resolve) => {
|
|
1582
|
+
fadeInPlayer.onDone(() => {
|
|
1583
|
+
this._currentComponentRef = newComponentRef;
|
|
1584
|
+
this._loadedViewClass = view;
|
|
1585
|
+
resolve();
|
|
1586
|
+
});
|
|
1587
|
+
fadeInPlayer.play();
|
|
1588
|
+
});
|
|
1589
|
+
return this._currentComponentRef;
|
|
1570
1590
|
}
|
|
1571
1591
|
/**
|
|
1572
1592
|
* Delete the currently loaded view from the views container, and leave it empty.
|
|
1573
1593
|
* If no view is currently loaded, this method will do nothing
|
|
1574
1594
|
*/
|
|
1575
|
-
popView() {
|
|
1595
|
+
async popView() {
|
|
1576
1596
|
this.verifyViewsContainerExist();
|
|
1577
|
-
if (this._loadedViewClass !== null) {
|
|
1578
|
-
this.
|
|
1597
|
+
if (this._loadedViewClass !== null && this._currentComponentRef) {
|
|
1598
|
+
await this.removeCurrentView();
|
|
1579
1599
|
}
|
|
1580
|
-
|
|
1600
|
+
}
|
|
1601
|
+
/**
|
|
1602
|
+
* Aux method to remove the currently loaded view from the views container using a promise
|
|
1603
|
+
*/
|
|
1604
|
+
removeCurrentView() {
|
|
1605
|
+
return new Promise((resolve) => {
|
|
1606
|
+
if (this._currentComponentRef) {
|
|
1607
|
+
const element = this._currentComponentRef.location.nativeElement;
|
|
1608
|
+
const fadeOutPlayer = this.animationBuilder.build([
|
|
1609
|
+
style({ opacity: 1 }),
|
|
1610
|
+
animate('300ms ease', style({ opacity: 0 }))
|
|
1611
|
+
]).create(element);
|
|
1612
|
+
fadeOutPlayer.onDone(() => {
|
|
1613
|
+
if (this._viewContainerRef !== null) {
|
|
1614
|
+
this._viewContainerRef.clear();
|
|
1615
|
+
}
|
|
1616
|
+
this._currentComponentRef = null;
|
|
1617
|
+
this._loadedViewClass = null;
|
|
1618
|
+
resolve();
|
|
1619
|
+
});
|
|
1620
|
+
fadeOutPlayer.play();
|
|
1621
|
+
}
|
|
1622
|
+
else {
|
|
1623
|
+
resolve();
|
|
1624
|
+
}
|
|
1625
|
+
});
|
|
1581
1626
|
}
|
|
1582
1627
|
/**
|
|
1583
1628
|
* Auxiliary method to test if the views container instance is available on the application
|
|
@@ -1587,7 +1632,7 @@ class ViewsService extends SingletoneStrictClass {
|
|
|
1587
1632
|
throw new Error('Views container not defined. Please declare a <views-container> element in your application');
|
|
1588
1633
|
}
|
|
1589
1634
|
}
|
|
1590
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: ViewsService, deps: [{ token:
|
|
1635
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: ViewsService, deps: [{ token: i1$2.AnimationBuilder }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1591
1636
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: ViewsService, providedIn: 'root' }); }
|
|
1592
1637
|
}
|
|
1593
1638
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: ViewsService, decorators: [{
|
|
@@ -1595,7 +1640,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImpor
|
|
|
1595
1640
|
args: [{
|
|
1596
1641
|
providedIn: 'root',
|
|
1597
1642
|
}]
|
|
1598
|
-
}], ctorParameters: () => [{ type:
|
|
1643
|
+
}], ctorParameters: () => [{ type: i1$2.AnimationBuilder }] });
|
|
1599
1644
|
|
|
1600
1645
|
/**
|
|
1601
1646
|
* TurboGUI is A library that helps with the most common and generic UI elements and functionalities
|
|
@@ -1740,6 +1785,10 @@ class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
1740
1785
|
* It may be filtered or not depending on this component setup and the user input
|
|
1741
1786
|
*/
|
|
1742
1787
|
this.filteredOptions = [];
|
|
1788
|
+
/**
|
|
1789
|
+
* Stores the number of options that are currently visible to the user
|
|
1790
|
+
*/
|
|
1791
|
+
this.filteredOptionsCount = 0;
|
|
1743
1792
|
/**
|
|
1744
1793
|
* Contains the original list of elements that are provided to be listed on this component before
|
|
1745
1794
|
* being possibly filtered. It is only used as a backup, not shown to the user
|
|
@@ -1766,6 +1815,7 @@ class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
1766
1815
|
throw new Error('DialogSingleSelectionListComponent expects one or more options');
|
|
1767
1816
|
}
|
|
1768
1817
|
this.originalOptions = data.options;
|
|
1818
|
+
this.filteredOptionsCount = this.originalOptions.length;
|
|
1769
1819
|
for (let option of this.originalOptions) {
|
|
1770
1820
|
this.filteredOptions.push(option);
|
|
1771
1821
|
this.originalOptionsFullTextSearch.push(StringUtils.formatForFullTextSearch(option));
|
|
@@ -1777,17 +1827,33 @@ class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
1777
1827
|
getListItemsContainerMaxheight() {
|
|
1778
1828
|
return (this.browserService.getWindowHeight() * 0.6) + 'px';
|
|
1779
1829
|
}
|
|
1830
|
+
/**
|
|
1831
|
+
* If the user presses enter key and there's only one element filtered in the list, we will close this dialog
|
|
1832
|
+
* setting that element as the selected.
|
|
1833
|
+
*/
|
|
1834
|
+
onIntroKeyPress() {
|
|
1835
|
+
if (this.filteredOptionsCount === 1) {
|
|
1836
|
+
for (let i = 0; i < this.originalOptionsFullTextSearch.length; i++) {
|
|
1837
|
+
if (this.filteredOptions[i] !== '') {
|
|
1838
|
+
this.closeDialog(i);
|
|
1839
|
+
return;
|
|
1840
|
+
}
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1843
|
+
}
|
|
1780
1844
|
/**
|
|
1781
1845
|
* When the user types a value on the input element to filter the list, this method will perform
|
|
1782
1846
|
* that filtering and refresh the list
|
|
1783
1847
|
*/
|
|
1784
1848
|
onSearchChange(input) {
|
|
1785
1849
|
this.selectedItemIndex = -1;
|
|
1850
|
+
this.filteredOptionsCount = 0;
|
|
1786
1851
|
let inputValue = StringUtils.formatForFullTextSearch(input.value);
|
|
1787
1852
|
for (let i = 0; i < this.originalOptionsFullTextSearch.length; i++) {
|
|
1788
1853
|
if (inputValue === '' ||
|
|
1789
1854
|
this.originalOptionsFullTextSearch[i].indexOf(inputValue) >= 0) {
|
|
1790
1855
|
this.filteredOptions[i] = this.originalOptions[i];
|
|
1856
|
+
this.filteredOptionsCount++;
|
|
1791
1857
|
}
|
|
1792
1858
|
else {
|
|
1793
1859
|
this.filteredOptions[i] = '';
|
|
@@ -1795,11 +1861,11 @@ class DialogSingleSelectionListComponent extends DialogBaseComponent {
|
|
|
1795
1861
|
}
|
|
1796
1862
|
}
|
|
1797
1863
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DialogSingleSelectionListComponent, deps: [{ token: i0.ElementRef }, { token: i1.MatDialogRef }, { token: BrowserService }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1798
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: DialogSingleSelectionListComponent, isStandalone: true, selector: "tg-dialog-single-selection-list", providers: [], usesInheritance: true, ngImport: i0, template: "<h3>\r\n {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 && !stringUtils.isEmpty(data.texts[1])\">\r\n {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 && !stringUtils.isEmpty(data.texts[2])\"\r\n class=\"searchItemInputContainer\">\r\n \r\n <mat-label>{{data.texts[2]}}</mat-label>\r\n <input matInput autoFocusOnDisplay\r\n (input)=\"onSearchChange($event.target)\">\r\n \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n <div class=\"listItemContainer\"\r\n [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n \r\n <p *ngIf=\"item !== ''\">\r\n {{item}}\r\n </p>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n [disabled]=\"selectedItemIndex < 0\"\r\n (click)=\"closeDialog(selectedItemIndex)\"\r\n *ngIf=\"data.texts.length > 3\">\r\n\r\n {{data.texts[3]}}\r\n \r\n</button>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: TurboGuiAngularModule }, { kind: "directive", type: AutoFocusOnDisplayDirective, selector: "[autoFocusOnDisplay]" }] }); }
|
|
1864
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: DialogSingleSelectionListComponent, isStandalone: true, selector: "tg-dialog-single-selection-list", providers: [], usesInheritance: true, ngImport: i0, template: "<h3>\r\n {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 && !stringUtils.isEmpty(data.texts[1])\">\r\n {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 && !stringUtils.isEmpty(data.texts[2])\"\r\n class=\"searchItemInputContainer\">\r\n \r\n <mat-label>{{data.texts[2]}}</mat-label>\r\n <input matInput autoFocusOnDisplay\r\n (keyup.enter)=\"onIntroKeyPress()\"\r\n (input)=\"onSearchChange($event.target)\">\r\n \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n <div class=\"listItemContainer\"\r\n [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n \r\n <p *ngIf=\"item !== ''\">\r\n {{item}}\r\n </p>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n [disabled]=\"selectedItemIndex < 0\"\r\n (click)=\"closeDialog(selectedItemIndex)\"\r\n *ngIf=\"data.texts.length > 3\">\r\n\r\n {{data.texts[3]}}\r\n \r\n</button>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: TurboGuiAngularModule }, { kind: "directive", type: AutoFocusOnDisplayDirective, selector: "[autoFocusOnDisplay]" }] }); }
|
|
1799
1865
|
}
|
|
1800
1866
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: DialogSingleSelectionListComponent, decorators: [{
|
|
1801
1867
|
type: Component,
|
|
1802
|
-
args: [{ selector: 'tg-dialog-single-selection-list', standalone: true, imports: [CommonModule, MatInputModule, MatFormFieldModule, TurboGuiAngularModule], providers: [], template: "<h3>\r\n {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 && !stringUtils.isEmpty(data.texts[1])\">\r\n {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 && !stringUtils.isEmpty(data.texts[2])\"\r\n class=\"searchItemInputContainer\">\r\n \r\n <mat-label>{{data.texts[2]}}</mat-label>\r\n <input matInput autoFocusOnDisplay\r\n (input)=\"onSearchChange($event.target)\">\r\n \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n <div class=\"listItemContainer\"\r\n [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n \r\n <p *ngIf=\"item !== ''\">\r\n {{item}}\r\n </p>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n [disabled]=\"selectedItemIndex < 0\"\r\n (click)=\"closeDialog(selectedItemIndex)\"\r\n *ngIf=\"data.texts.length > 3\">\r\n\r\n {{data.texts[3]}}\r\n \r\n</button>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"] }]
|
|
1868
|
+
args: [{ selector: 'tg-dialog-single-selection-list', standalone: true, imports: [CommonModule, MatInputModule, MatFormFieldModule, TurboGuiAngularModule], providers: [], template: "<h3>\r\n {{data.texts[0]}}\r\n</h3>\r\n\r\n<!-- Here goes the dialog subtitle. Leave it blank if you don't need it -->\r\n<p *ngIf=\"data.texts.length > 1 && !stringUtils.isEmpty(data.texts[1])\">\r\n {{data.texts[1]}}\r\n</p>\r\n\r\n<mat-form-field *ngIf=\"data.texts.length > 2 && !stringUtils.isEmpty(data.texts[2])\"\r\n class=\"searchItemInputContainer\">\r\n \r\n <mat-label>{{data.texts[2]}}</mat-label>\r\n <input matInput autoFocusOnDisplay\r\n (keyup.enter)=\"onIntroKeyPress()\"\r\n (input)=\"onSearchChange($event.target)\">\r\n \r\n</mat-form-field>\r\n\r\n<!-- here goes the list of elements that will be shown to the user -->\r\n<div class=\"listItemsContainer\"\r\n [style.max-height]=\"getListItemsContainerMaxheight()\">\r\n\r\n <div class=\"listItemContainer\"\r\n [style.background-color]=\"selectedItemIndex === i ? '#90d1ffad' : (i % 2 === 0 ? 'initial' : '#00000009')\"\r\n *ngFor=\"let item of filteredOptions; let i = index; trackBy: trackByFn\"\r\n (click)=\"data.texts.length < 4 ? closeDialog(i) : selectedItemIndex = i\">\r\n \r\n <p *ngIf=\"item !== ''\">\r\n {{item}}\r\n </p>\r\n \r\n </div>\r\n\r\n</div>\r\n\r\n<button mat-raised-button color=\"primary\"\r\n [disabled]=\"selectedItemIndex < 0\"\r\n (click)=\"closeDialog(selectedItemIndex)\"\r\n *ngIf=\"data.texts.length > 3\">\r\n\r\n {{data.texts[3]}}\r\n \r\n</button>", styles: [":host{min-height:300px}h3{margin-top:0;margin-bottom:10px}p{margin-top:0;margin-bottom:5px}.searchItemInputContainer{width:100%;margin-top:0;margin-bottom:0}.listItemsContainer{overflow-y:auto;border:1px solid rgba(0,0,0,.2);border-radius:4px;margin-bottom:5px}.listItemContainer p{line-height:36px;width:calc(100% - 12px);margin:0 0 0 6px}button{float:right}\n"] }]
|
|
1803
1869
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.MatDialogRef }, { type: BrowserService }, { type: undefined, decorators: [{
|
|
1804
1870
|
type: Inject,
|
|
1805
1871
|
args: [MAT_DIALOG_DATA]
|