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.
@@ -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 = '0s ease') {
23
+ static getTrigger(triggerName, enter = '1s ease', leave = '300ms ease') {
24
24
  return trigger(triggerName, [
25
- transition(':enter', [style({ opacity: 0 }), animate(enter)]),
26
- transition(':leave', [style({ opacity: 1 }), animate(leave, style({ opacity: 0 }))])
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFkZS5hbmltYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL3ZpZXcvYW5pbWF0aW9ucy9mYWRlLmFuaW1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBRzFFOztHQUVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUUzQjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQW1CLEVBQUUsS0FBSyxHQUFHLFNBQVMsRUFBRSxLQUFLLEdBQUcsU0FBUztRQUV2RSxPQUFPLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0QsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hGLENBQUMsQ0FBQztJQUNuQyxDQUFDOzhHQWZRLGtCQUFrQjtrSEFBbEIsa0JBQWtCOzsyRkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFR1cmJvR1VJIGlzIEEgbGlicmFyeSB0aGF0IGhlbHBzIHdpdGggdGhlIG1vc3QgY29tbW9uIGFuZCBnZW5lcmljIFVJIGVsZW1lbnRzIGFuZCBmdW5jdGlvbmFsaXRpZXNcclxuICpcclxuICogV2Vic2l0ZSA6IC0+IGh0dHA6Ly93d3cudHVyYm9ndWkub3JnXHJcbiAqIExpY2Vuc2UgOiAtPiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIExpY2Vuc2UgVXJsIDogLT4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqIENvcHlSaWdodCA6IC0+IENvcHlyaWdodCAyMDE4IEVkZXJ0b25lIEFkdmFuZGVkIFNvbHV0aW9ucy4gaHR0cHM6Ly93d3cuZWRlcnRvbmUuY29tXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0cmlnZ2VyLCBhbmltYXRlLCB0cmFuc2l0aW9uLCBzdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBGYWRlIGFuaW1hdGlvbnNcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZhZGVBbmltYXRpb25DbGFzcyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBjdXN0b20gdHJpZ2dlciB0byBjcmVhdGUgZmFkZSBhbmltYXRpb25zIHdoZW4gY29tcG9uZW50cyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBhcHBsaWNhdGlvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0cmlnZ2VyTmFtZSBUaGUgbmFtZSBmb3IgdGhlIHRyaWdnZXIgd2Ugd2FudCB0byBjcmVhdGVcclxuICAgICAqIEBwYXJhbSBlbnRlciBUaGUgdGltZSBhbmQgZWFzaW5nIHRoYXQgd2Ugd2FudCB0byB1c2UgZm9yIHRoZSBlbnRlciBzdGF0ZVxyXG4gICAgICogQHBhcmFtIGxlYXZlIFRoZSB0aW1lIGFuZCBlYXNpbmcgdGhhdCB3ZSB3YW50IHRvIHVzZSBmb3IgdGhlIGxlYXZlIHN0YXRlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRUcmlnZ2VyKHRyaWdnZXJOYW1lOiBzdHJpbmcsIGVudGVyID0gJzFzIGVhc2UnLCBsZWF2ZSA9ICcwcyBlYXNlJykge1xyXG5cclxuICAgICAgICByZXR1cm4gdHJpZ2dlcih0cmlnZ2VyTmFtZSwgW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHtvcGFjaXR5OiAwfSksIGFuaW1hdGUoZW50ZXIpXSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbc3R5bGUoe29wYWNpdHk6IDF9KSwgYW5pbWF0ZShsZWF2ZSwgc3R5bGUoe29wYWNpdHk6IDB9KSldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgIH1cclxufVxyXG4iXX0=
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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL3ZpZXcvY29tcG9uZW50cy9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0L2RpYWxvZy1zaW5nbGUtc2VsZWN0aW9uLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi92aWV3L2NvbXBvbmVudHMvZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7Ozs7OztBQUd2Rjs7Ozs7Ozs7Ozs7R0FXRztBQVdILE1BQU0sT0FBTyxrQ0FBbUMsU0FBUSxtQkFBbUI7YUFHdkQsc0JBQWlCLEdBQUcsb0NBQW9DLEFBQXZDLENBQXdDO0lBbUN6RSxZQUFtQixVQUFzQixFQUMvQixTQUE0QyxFQUNuQyxjQUE4QixFQUNMLElBQVM7UUFFakQsS0FBSyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUxkLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDL0IsY0FBUyxHQUFULFNBQVMsQ0FBbUM7UUFDbkMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ0wsU0FBSSxHQUFKLElBQUksQ0FBSztRQW5DckQ7O1dBRUc7UUFDSCxnQkFBVyxHQUFHLFdBQVcsQ0FBQztRQUUxQjs7O1dBR0c7UUFDSCxvQkFBZSxHQUFZLEVBQUUsQ0FBQztRQUc5Qjs7O1dBR0c7UUFDSyxvQkFBZSxHQUFZLEVBQUUsQ0FBQztRQUd0Qzs7O1dBR0c7UUFDSyxrQ0FBNkIsR0FBWSxFQUFFLENBQUM7UUFHcEQ7O1dBRUc7UUFDSCxzQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQStEdkI7OztXQUdHO1FBQ0gsY0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1FBekRqRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUV2QixNQUFNLElBQUksS0FBSyxDQUFDLDZKQUE2SixDQUFDLENBQUM7U0FDbEw7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUV6QixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7U0FDckY7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFcEMsS0FBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFDO1lBRW5DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDeEY7SUFDTCxDQUFDO0lBR0Q7O09BRUc7SUFDSCw4QkFBOEI7UUFFMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2hFLENBQUM7SUFHRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsS0FBc0I7UUFFakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTVCLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUM7WUFFL0QsSUFBRyxVQUFVLEtBQUssRUFBRTtnQkFDakIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUM7Z0JBRTlELElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUVyRDtpQkFBSTtnQkFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNoQztTQUNKO0lBQ0wsQ0FBQzs4R0FoR1Esa0NBQWtDLHNHQXlDdkIsZUFBZTtrR0F6QzFCLGtDQUFrQyw4RUFObkMsRUFBRSxpRENwQ2QsbTZDQTBDUyxrYURQRSxZQUFZLCtQQUFFLGNBQWMsc25CQUFFLGtCQUFrQiw4QkFBRSxxQkFBcUI7OzJGQU9yRSxrQ0FBa0M7a0JBVjlDLFNBQVM7K0JBQ0csaUNBQWlDLGNBQy9CLElBQUksV0FDVCxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLENBQUMsYUFDdkUsRUFBRTs7MEJBK0NHLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUdXJib0dVSSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRGlhbG9nQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2RpYWxvZy1iYXNlL2RpYWxvZy1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEJyb3dzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29udHJvbGxlci9icm93c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdHJpbmdVdGlscyB9IGZyb20gJ3R1cmJvY29tbW9ucy10cyc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgVHVyYm9HdWlBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvbW9kdWxlcy90dXJib2d1aS1hbmd1bGFyLm1vZHVsZSc7XG5cclxuXHJcbi8qKlxyXG4gKiBBIGRpYWxvZyBjb21wb25lbnQgd2hpY2ggYWxsb3dzIHVzIHRvIHNlbGVjdCBvbmUgc2luZ2xlIGl0ZW0gZnJvbSBhIGxpc3QuIFRoZSBlbGVtZW50cyBvbiB0aGF0IGxpc3QgYXJlIGRpc3BsYXllZCBvbiBhIHRhYmxlXHJcbiAqIHdoaWNoIG1heSBzaG93IGEgc2Nyb2xsIGlmIG5lY2Vzc2FyeSB3aGVuIHRoZXJlIGFyZSBtYW55IGVsZW1lbnRzIG9uIHRoZSBsaXN0LlxyXG4gKiBcclxuICogSXQgYWxzbyBhbGxvd3MgdXMgdG8gZmlsdGVyIGluc2lkZSB0aGUgbGlzdCB3aXRoIGEgY3VzdG9tIHRleHQgdGhhdCB3ZSBjYW4gdHlwZSBpbnRvIGEgc2VhcmNoIGlucHV0LCB3aGljaCBpcyBvcHRpb25hbC5cclxuICpcclxuICogdGV4dHMgcGFyYW1ldGVyIG11c3QgY29udGFpbiB0aGUgdGl0bGUsIHRoZSBkZXNjcmlwdGlvbiAob3B0aW9uYWwpLCB0aGUgZmlsdGVyIGlucHV0IHRpdGxlIChvcHRpb25hbCksIGFuZCB0aGUgc3VibWl0IGJ1dHRvbiBjYXB0aW9uLlxyXG4gKiBJZiB0aGF0IGNhcHRpb24gaXMgbm90IHByb3ZpZGVkLCB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBwZXJmb3JtZWQgb25jZSB1c2VyIGNsaWNrcyBvbiBhbiBlbGVtZW50IG9uIHRoZSBsaXN0LiBPdGhlcndpc2UsIFxyXG4gKiB0aGUgZWxlbWVudCB3aWxsIGJlIHNlbGVjdGVkIG9uIHRoZSBsaXN0IGFuZCB0aGUgc2VsZWN0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIG9uY2UgdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBzdWJtaXQgYnV0dG9uLlxyXG4gKlxyXG4gKiBvcHRpb25zIHBhcmFtZXRlciBtdXN0IGNvbnRhaW4gdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciAgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBcdHNlbGVjdG9yOiAndGctZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdCcsXHJcbiAgXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIFR1cmJvR3VpQW5ndWxhck1vZHVsZV0sXHJcblx0cHJvdmlkZXJzOiBbXSxcclxuICBcdHRlbXBsYXRlVXJsOiAnLi9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0LmNvbXBvbmVudC5odG1sJyxcclxuICBcdHN0eWxlVXJsczogWycuL2RpYWxvZy1zaW5nbGUtc2VsZWN0aW9uLWxpc3QuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dTaW5nbGVTZWxlY3Rpb25MaXN0Q29tcG9uZW50IGV4dGVuZHMgRGlhbG9nQmFzZUNvbXBvbmVudCB7XHJcbiAgICBcclxuICAgIFxyXG4gICAgc3RhdGljIHJlYWRvbmx5IERJQUxPR19DTEFTU19OQU1FID0gJ0RpYWxvZ1NpbmdsZVNlbGVjdGlvbkxpc3RDb21wb25lbnQnO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRGVjbGFyZSBhIHJlZmVyZW5jZSB0byB0aGUgc3RyaW5nIHV0aWxzIGNsYXNzIHNvIGl0IGNhbiBiZSB1c2VkIG9uIHRoZSBodG1sIHBhcnRcclxuICAgICAqL1xyXG4gICAgc3RyaW5nVXRpbHMgPSBTdHJpbmdVdGlscztcclxuICAgIFxyXG4gICAgLyoqIFxyXG4gICAgICogQ29udGFpbnMgdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCB3aWxsIGJlIGRpcmVjdGx5IHNob3duIHRvIHRoZSB1c2VyIGF0IHRoZSBjb21wb25lbnQgbGlzdC5cclxuICAgICAqIEl0IG1heSBiZSBmaWx0ZXJlZCBvciBub3QgZGVwZW5kaW5nIG9uIHRoaXMgY29tcG9uZW50IHNldHVwIGFuZCB0aGUgdXNlciBpbnB1dFxyXG4gICAgICovXHJcbiAgICBmaWx0ZXJlZE9wdGlvbnM6c3RyaW5nW10gPSBbXTtcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENvbnRhaW5zIHRoZSBvcmlnaW5hbCBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHByb3ZpZGVkIHRvIGJlIGxpc3RlZCBvbiB0aGlzIGNvbXBvbmVudCBiZWZvcmVcclxuICAgICAqIGJlaW5nIHBvc3NpYmx5IGZpbHRlcmVkLiBJdCBpcyBvbmx5IHVzZWQgYXMgYSBiYWNrdXAsIG5vdCBzaG93biB0byB0aGUgdXNlclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9yaWdpbmFsT3B0aW9uczpzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNhbWUgbGlzdCBhcyB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBidXQgcHJvY2Vzc2VkIGZvciBhIGJldHRlciB0ZXh0IHNlYXJjaC5cclxuICAgICAqIEl0IHdpbGwgYmUgdXNlZCB0byBwZXJmb3JtIHRoZSBzZWFyY2gsIGJ1dCBub3Qgc2hvd24gdG8gdGhlIHVzZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2g6c3RyaW5nW10gPSBbXTtcclxuICAgICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFN0b3JlcyB0aGUgaW5kZXggZm9yIHRoZSBlbGVtZW50IHRoYXQncyBiZWVuIHNlbGVjdGVkIGJ5IHRoZSB1c2VyXHJcbiAgICAgKi9cclxuICAgIHNlbGVjdGVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIFx0XHRcdHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEaWFsb2dCYXNlQ29tcG9uZW50PixcclxuICAgICAgICAgICAgICAgIHB1YmxpYyBicm93c2VyU2VydmljZTogQnJvd3NlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSkge1xyXG5cclxuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBkaWFsb2dSZWYpO1xyXG5cclxuICAgICAgICBpZiAoZGF0YS50ZXh0cy5sZW5ndGggPCAxKSB7XHJcblxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpYWxvZ1NpbmdsZVNlbGVjdGlvbkxpc3RDb21wb25lbnQgZXhwZWN0cyA0IHRleHRzOiBUaGUgdGl0bGUsIHRoZSBkZXNjcmlwdGlvbiAob3B0aW9uYWwpLCB0aGUgZmlsdGVyIGlucHV0IHRpdGxlIChvcHRpb25hbCksIGFuZCB0aGUgc3VibWl0IGJ1dHRvbiBjYXB0aW9uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChkYXRhLm9wdGlvbnMubGVuZ3RoIDwgMSkge1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaWFsb2dTaW5nbGVTZWxlY3Rpb25MaXN0Q29tcG9uZW50IGV4cGVjdHMgb25lIG9yIG1vcmUgb3B0aW9ucycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9ucyA9IGRhdGEub3B0aW9ucztcclxuICAgICAgICBcclxuICAgICAgICBmb3IobGV0IG9wdGlvbiBvZiB0aGlzLm9yaWdpbmFsT3B0aW9ucyl7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucy5wdXNoKG9wdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2gucHVzaChTdHJpbmdVdGlscy5mb3JtYXRGb3JGdWxsVGV4dFNlYXJjaChvcHRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdG8gY2FsY3VsYXRlIHRoZSBtYXggcG9zc2libGUgaGVpZ2h0IHRoYXQgdGhlIGxpc3QgaXRlbXMgY29udGFpbmVyIGlzIGFsbG93ZWQgdG8gaGF2ZVxyXG4gICAgICovXHJcbiAgICBnZXRMaXN0SXRlbXNDb250YWluZXJNYXhoZWlnaHQoKXtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gKHRoaXMuYnJvd3NlclNlcnZpY2UuZ2V0V2luZG93SGVpZ2h0KCkgKiAwLjYpICsgJ3B4JztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRoZSB1c2VyIHR5cGVzIGEgdmFsdWUgb24gdGhlIGlucHV0IGVsZW1lbnQgdG8gZmlsdGVyIHRoZSBsaXN0LCB0aGlzIG1ldGhvZCB3aWxsIHBlcmZvcm1cclxuICAgICAqIHRoYXQgZmlsdGVyaW5nIGFuZCByZWZyZXNoIHRoZSBsaXN0XHJcbiAgICAgKi9cclxuICAgIG9uU2VhcmNoQ2hhbmdlKGlucHV0OkhUTUxJbnB1dEVsZW1lbnQpe1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICAgICBcclxuICAgICAgICBsZXQgaW5wdXRWYWx1ZSA9IFN0cmluZ1V0aWxzLmZvcm1hdEZvckZ1bGxUZXh0U2VhcmNoKGlucHV0LnZhbHVlKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9yaWdpbmFsT3B0aW9uc0Z1bGxUZXh0U2VhcmNoLmxlbmd0aDsgaSsrKXtcclxuXHJcbiAgICAgICAgICAgIGlmKGlucHV0VmFsdWUgPT09ICcnIHx8XHJcbiAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxPcHRpb25zRnVsbFRleHRTZWFyY2hbaV0uaW5kZXhPZihpbnB1dFZhbHVlKSA+PSAwKXtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tpXSA9IHRoaXMub3JpZ2luYWxPcHRpb25zW2ldO1xyXG5cclxuICAgICAgICAgICAgfWVsc2V7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNbaV0gPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdyZWF0bHkgaW1wcm92ZSBuZ0ZvciBwZXJmb3JtYW5jZSB3aXRoIGFycmF5cyBvZiBwcmltaXRpdmUgdmFsdWVzLiBJdCB0ZWxscyB0aGUgcmVmcmVzaFxyXG4gICAgICogZnVuY3Rpb24gdG8gd29yayBieSBpbmRleCBpbnN0ZWFkIG9mIGJ5IHZhbHVlLiBUaGUgY2hhbmdlIGluIHBlcmZvcm1hbmNlIHdoZW4gcmVmcmVzaGluZyB0aGUgbGlzdCBpcyBtYXNzaXZlLiBcclxuICAgICAqL1xyXG4gICAgdHJhY2tCeUZuID0gKGluZGV4OiBudW1iZXIsIF92YWx1ZTogc3RyaW5nKSA9PiBpbmRleDtcclxufVxyXG4iLCI8aDM+XHJcbiAgICB7e2RhdGEudGV4dHNbMF19fVxyXG48L2gzPlxyXG5cclxuPCEtLSBIZXJlIGdvZXMgdGhlIGRpYWxvZyBzdWJ0aXRsZS4gTGVhdmUgaXQgYmxhbmsgaWYgeW91IGRvbid0IG5lZWQgaXQgLS0+XHJcbjxwICpuZ0lmPVwiZGF0YS50ZXh0cy5sZW5ndGggPiAxICZhbXA7JmFtcDsgIXN0cmluZ1V0aWxzLmlzRW1wdHkoZGF0YS50ZXh0c1sxXSlcIj5cclxuICAgIHt7ZGF0YS50ZXh0c1sxXX19XHJcbjwvcD5cclxuXHJcbjxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImRhdGEudGV4dHMubGVuZ3RoID4gMiAmYW1wOyZhbXA7ICFzdHJpbmdVdGlscy5pc0VtcHR5KGRhdGEudGV4dHNbMl0pXCJcclxuICAgIGNsYXNzPVwic2VhcmNoSXRlbUlucHV0Q29udGFpbmVyXCI+XHJcbiAgICBcclxuICAgIDxtYXQtbGFiZWw+e3tkYXRhLnRleHRzWzJdfX08L21hdC1sYWJlbD5cclxuICAgIDxpbnB1dCBtYXRJbnB1dCBhdXRvRm9jdXNPbkRpc3BsYXlcclxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50LnRhcmdldClcIj5cclxuICAgICAgICBcclxuPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbjwhLS0gaGVyZSBnb2VzIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBzaG93biB0byB0aGUgdXNlciAtLT5cclxuPGRpdiBjbGFzcz1cImxpc3RJdGVtc0NvbnRhaW5lclwiXHJcbiAgICBbc3R5bGUubWF4LWhlaWdodF09XCJnZXRMaXN0SXRlbXNDb250YWluZXJNYXhoZWlnaHQoKVwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJsaXN0SXRlbUNvbnRhaW5lclwiXHJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2VsZWN0ZWRJdGVtSW5kZXggPT09IGkgPyAnIzkwZDFmZmFkJyA6IChpICUgMiA9PT0gMCA/ICdpbml0aWFsJyA6ICcjMDAwMDAwMDknKVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRPcHRpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxyXG4gICAgICAgIChjbGljayk9XCJkYXRhLnRleHRzLmxlbmd0aCA8IDQgPyBjbG9zZURpYWxvZyhpKSA6IHNlbGVjdGVkSXRlbUluZGV4ID0gaVwiPlxyXG4gICAgXHJcbiAgICAgICAgPHAgKm5nSWY9XCJpdGVtICE9PSAnJ1wiPlxyXG4gICAgICAgICAgICB7e2l0ZW19fVxyXG4gICAgICAgIDwvcD5cclxuICAgIFxyXG4gICAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCJcclxuICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZEl0ZW1JbmRleCA8IDBcIlxyXG4gICAgKGNsaWNrKT1cImNsb3NlRGlhbG9nKHNlbGVjdGVkSXRlbUluZGV4KVwiXHJcbiAgICAqbmdJZj1cImRhdGEudGV4dHMubGVuZ3RoID4gM1wiPlxyXG5cclxuICAgIHt7ZGF0YS50ZXh0c1szXX19XHJcbiAgICBcclxuPC9idXR0b24+Il19
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL3ZpZXcvY29tcG9uZW50cy9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0L2RpYWxvZy1zaW5nbGUtc2VsZWN0aW9uLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi92aWV3L2NvbXBvbmVudHMvZGlhbG9nLXNpbmdsZS1zZWxlY3Rpb24tbGlzdC9kaWFsb2ctc2luZ2xlLXNlbGVjdGlvbi1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7Ozs7OztBQUd2Rjs7Ozs7Ozs7Ozs7R0FXRztBQVdILE1BQU0sT0FBTyxrQ0FBbUMsU0FBUSxtQkFBbUI7YUFHdkQsc0JBQWlCLEdBQUcsb0NBQW9DLEFBQXZDLENBQXdDO0lBeUN6RSxZQUFtQixVQUFzQixF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Q0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLG9CQUFvQixFQUFHLENBQUM7YUFFaEM7aUJBQUk7Z0JBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDaEM7U0FDSjtJQUNMLENBQUM7OEdBOUhRLGtDQUFrQyxzR0ErQ3ZCLGVBQWU7a0dBL0MxQixrQ0FBa0MsOEVBTm5DLEVBQUUsaURDcENkLGs5Q0EyQ1Msa2FEUkUsWUFBWSwrUEFBRSxjQUFjLHNuQkFBRSxrQkFBa0IsOEJBQUUscUJBQXFCOzsyRkFPckUsa0NBQWtDO2tCQVY5QyxTQUFTOytCQUNHLGlDQUFpQyxjQUMvQixJQUFJLFdBQ1QsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLGFBQ3ZFLEVBQUU7OzBCQXFERyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+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 = '0s ease') {
504
+ static getTrigger(triggerName, enter = '1s ease', leave = '300ms ease') {
504
505
  return trigger(triggerName, [
505
- transition(':enter', [style({ opacity: 0 }), animate(enter)]),
506
- transition(':leave', [style({ opacity: 1 }), animate(leave, style({ opacity: 0 }))])
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
- * Note: We can modify the busy state component that is shown by this method. To do it, we must
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
- * Remove the application busy state and restore it back to normal user interaction
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(componentFactoryResolver) {
1517
+ constructor(animationBuilder) {
1516
1518
  super(ViewsService);
1517
- this.componentFactoryResolver = componentFactoryResolver;
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
- // If the loaded view is the same as the specified one, we will do nothing
1559
- if (this._loadedViewClass === view) {
1560
- return;
1561
- }
1562
- this.popView();
1563
- }
1564
- this.verifyViewsContainerExist();
1565
- const factory = this.componentFactoryResolver.resolveComponentFactory(view);
1566
- const componentRef = this._viewContainerRef.createComponent(factory);
1567
- componentRef.changeDetectorRef.detectChanges();
1568
- this._loadedViewClass = view;
1569
- return componentRef;
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._viewContainerRef.clear();
1597
+ if (this._loadedViewClass !== null && this._currentComponentRef) {
1598
+ await this.removeCurrentView();
1579
1599
  }
1580
- this._loadedViewClass = null;
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: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Injectable }); }
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: i0.ComponentFactoryResolver }] });
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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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 &amp;&amp; !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]