brainloper-ui 14.1.0 → 14.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/esm2020/brainloper-ui.mjs +4 -4
  2. package/esm2020/public_api.mjs +56 -51
  3. package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +310 -305
  4. package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +29 -29
  5. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +23 -23
  6. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +83 -83
  7. package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +37 -31
  8. package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +176 -176
  9. package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +728 -652
  10. package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +118 -118
  11. package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +186 -185
  12. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.mjs +1 -1
  13. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.mjs +1 -1
  14. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.mjs +1 -1
  15. package/esm2020/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +222 -222
  16. package/esm2020/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.mjs +80 -80
  17. package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +81 -81
  18. package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +108 -108
  19. package/esm2020/src/app/modules/directives/carousel-item.directive.mjs +18 -0
  20. package/esm2020/src/app/modules/interfaces/buttons/button-icon.mjs +2 -2
  21. package/esm2020/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +2 -2
  22. package/esm2020/src/app/modules/interfaces/combos/combos-configuration.mjs +2 -2
  23. package/esm2020/src/app/modules/interfaces/data-table/params.mjs +2 -2
  24. package/esm2020/src/app/modules/interfaces/data-table/rules.mjs +2 -2
  25. package/esm2020/src/app/modules/interfaces/data-table/table-columns.mjs +2 -2
  26. package/esm2020/src/app/modules/interfaces/data-table/table-configuration.mjs +2 -2
  27. package/esm2020/src/app/modules/interfaces/enum/enumActions.mjs +8 -7
  28. package/esm2020/src/app/modules/interfaces/enum/enumRules.mjs +8 -8
  29. package/esm2020/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +2 -2
  30. package/esm2020/src/app/modules/interfaces/file-forms-service/file-input-params.mjs +2 -2
  31. package/esm2020/src/app/modules/interfaces/filters/header-filters.mjs +2 -2
  32. package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +8 -8
  33. package/esm2020/src/app/modules/interfaces/report/template-pdf-ot.mjs +2 -2
  34. package/esm2020/src/app/modules/interfaces/report/template-pfd-fo.mjs +2 -2
  35. package/esm2020/src/app/modules/services/crypto.service.mjs +37 -37
  36. package/esm2020/src/app/modules/services/export-data.service.mjs +166 -166
  37. package/esm2020/src/app/modules/services/file-forms.service.mjs +24 -24
  38. package/esm2020/src/app/modules/services/functions.service.mjs +54 -54
  39. package/esm2020/src/app/modules/services/generate-pdf.service.mjs +58 -58
  40. package/esm2020/src/app/modules/services/http.service.mjs +97 -154
  41. package/esm2020/src/app/modules/services/loading/loading.component.mjs +28 -28
  42. package/esm2020/src/app/modules/services/local-storage.service.mjs +115 -115
  43. package/esm2020/src/app/modules/services/message.service.mjs +200 -200
  44. package/esm2020/src/app/modules/services/screen-size-util.mjs +6 -6
  45. package/esm2020/src/app/modules/services/session.service.mjs +42 -42
  46. package/fesm2015/brainloper-ui.mjs +2819 -2769
  47. package/fesm2015/brainloper-ui.mjs.map +1 -1
  48. package/fesm2020/brainloper-ui.mjs +2779 -2733
  49. package/fesm2020/brainloper-ui.mjs.map +1 -1
  50. package/index.d.ts +5 -5
  51. package/package.json +3 -1
  52. package/public_api.d.ts +55 -50
  53. package/src/app/modules/brainloper-ui/brainloper-ui.module.d.ts +62 -73
  54. package/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.d.ts +13 -13
  55. package/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.d.ts +10 -10
  56. package/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.d.ts +24 -24
  57. package/src/app/modules/brainloper-ui/components/carousel/carousel.component.d.ts +15 -12
  58. package/src/app/modules/brainloper-ui/components/combos/combos.component.d.ts +46 -46
  59. package/src/app/modules/brainloper-ui/components/data-table/data-table.component.d.ts +125 -119
  60. package/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.d.ts +21 -21
  61. package/src/app/modules/brainloper-ui/components/file-input/file-input.component.d.ts +42 -42
  62. package/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.d.ts +2 -2
  63. package/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.d.ts +2 -2
  64. package/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.d.ts +2 -2
  65. package/src/app/modules/brainloper-ui/components/filters/filters.component.d.ts +30 -30
  66. package/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.d.ts +35 -35
  67. package/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.d.ts +36 -36
  68. package/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.d.ts +26 -26
  69. package/src/app/modules/directives/carousel-item.directive.d.ts +9 -0
  70. package/src/app/modules/interfaces/buttons/button-icon.d.ts +9 -9
  71. package/src/app/modules/interfaces/buttons/button-lavel-edit.d.ts +6 -6
  72. package/src/app/modules/interfaces/combos/combos-configuration.d.ts +13 -13
  73. package/src/app/modules/interfaces/data-table/params.d.ts +7 -7
  74. package/src/app/modules/interfaces/data-table/rules.d.ts +8 -8
  75. package/src/app/modules/interfaces/data-table/table-columns.d.ts +25 -25
  76. package/src/app/modules/interfaces/data-table/table-configuration.d.ts +26 -25
  77. package/src/app/modules/interfaces/enum/enumActions.d.ts +6 -5
  78. package/src/app/modules/interfaces/enum/enumRules.d.ts +6 -6
  79. package/src/app/modules/interfaces/file-forms-service/file-forms-params.d.ts +4 -4
  80. package/src/app/modules/interfaces/file-forms-service/file-input-params.d.ts +13 -13
  81. package/src/app/modules/interfaces/filters/header-filters.d.ts +13 -13
  82. package/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.d.ts +10 -10
  83. package/src/app/modules/interfaces/report/template-pdf-ot.d.ts +19 -19
  84. package/src/app/modules/interfaces/report/template-pfd-fo.d.ts +20 -20
  85. package/src/app/modules/services/crypto.service.d.ts +10 -10
  86. package/src/app/modules/services/export-data.service.d.ts +18 -18
  87. package/src/app/modules/services/file-forms.service.d.ts +7 -7
  88. package/src/app/modules/services/functions.service.d.ts +13 -13
  89. package/src/app/modules/services/generate-pdf.service.d.ts +12 -12
  90. package/src/app/modules/services/http.service.d.ts +22 -21
  91. package/src/app/modules/services/loading/loading.component.d.ts +15 -15
  92. package/src/app/modules/services/local-storage.service.d.ts +49 -49
  93. package/src/app/modules/services/message.service.d.ts +23 -23
  94. package/src/app/modules/services/screen-size-util.d.ts +3 -3
  95. package/src/app/modules/services/session.service.d.ts +14 -14
@@ -1,176 +1,176 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
2
- import { UntypedFormControl } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../../services/http.service";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "@angular/material/icon";
7
- import * as i4 from "@angular/material/form-field";
8
- import * as i5 from "@angular/material/select";
9
- import * as i6 from "@angular/material/core";
10
- import * as i7 from "@angular/material/tooltip";
11
- import * as i8 from "@angular/forms";
12
- import * as i9 from "../select-filter/select-filter.component";
13
- export class CombosComponent {
14
- constructor(http) {
15
- this.http = http;
16
- this.filter = false;
17
- this.checkbox = false;
18
- this.required = false;
19
- this.disabled = false;
20
- this.addFinal = false;
21
- this.appearance = '';
22
- this.control = new UntypedFormControl();
23
- this.tooltipDescription = null;
24
- this.tooltipActive = false;
25
- this.changeOption = new EventEmitter();
26
- this.changeOptionDataComplete = new EventEmitter();
27
- this.returnDataCombo = new EventEmitter();
28
- }
29
- ngOnInit() {
30
- if (!this.configuration.label) {
31
- this.configuration.label = this.configuration.visibleField;
32
- }
33
- this.initData();
34
- if (this.reloadCombo) {
35
- this.reloadCombo.subscribe((res) => {
36
- if (res == 'selected') {
37
- this.control.setValue(this.configuration.selected);
38
- }
39
- else {
40
- this.initData();
41
- }
42
- });
43
- }
44
- this.control.setValue(this.configuration.selected);
45
- //console.log(this.configuration)
46
- }
47
- ngOnChanges(changes) {
48
- if (this.dataCombos && changes?.dataCombos) {
49
- this.dataCombos = changes.dataCombos.currentValue;
50
- this.filteredList = this.dataCombos.slice();
51
- }
52
- if (this.control && this.control.value) {
53
- this.configuration.selected = this.control.value;
54
- }
55
- }
56
- initData() {
57
- if (this.configuration.urlCombo) {
58
- this.getData();
59
- }
60
- else {
61
- if (this.dataCombos) {
62
- this.filteredList = this.dataCombos.slice();
63
- }
64
- }
65
- }
66
- getData() {
67
- this.http
68
- .getData(this.configuration.urlCombo, this.configuration.urlParams)
69
- .subscribe((res) => {
70
- if (res['code'] === 0) {
71
- this.dataCombos = res['body'];
72
- if (this.additionalData) {
73
- if (this.addFinal) {
74
- this.dataCombos = this.dataCombos.concat(this.additionalData);
75
- }
76
- else {
77
- this.dataCombos = this.additionalData.concat(this.dataCombos);
78
- }
79
- }
80
- this.returnDataCombo.emit(this.dataCombos);
81
- this.filteredList = this.dataCombos.slice();
82
- }
83
- else {
84
- console.log('error en la consulta para datos combo');
85
- }
86
- }, (err) => {
87
- console.log(err);
88
- });
89
- }
90
- selectedData($event) {
91
- this.findData($event);
92
- this.changeOption.emit($event.value);
93
- }
94
- findData($event) {
95
- let d = [];
96
- if (this.checkbox) {
97
- const lookup = new Map(this.dataCombos.map((item) => [
98
- item[this.configuration.selectionField],
99
- item,
100
- ]));
101
- for (const id of $event.value) {
102
- const foundItem = lookup.get(id);
103
- if (foundItem) {
104
- d.push(foundItem);
105
- }
106
- }
107
- }
108
- else {
109
- d = this.dataCombos.find((x) => x[this.configuration.selectionField] == $event.value);
110
- }
111
- this.changeOptionDataComplete.emit(d);
112
- if (this.configuration.fileTooltip && !this.checkbox) {
113
- if (d) {
114
- this.tooltipDescription = d[this.configuration.fileTooltip];
115
- this.tooltipActive = true;
116
- setTimeout(() => {
117
- this.tooltip.show();
118
- }, 50);
119
- setTimeout(() => {
120
- this.tooltip.hide();
121
- }, 10000);
122
- }
123
- else
124
- this.tooltipDescription = null;
125
- }
126
- else
127
- this.tooltipDescription = null;
128
- }
129
- toggleTooltip() {
130
- this.tooltipActive = !this.tooltipActive;
131
- if (this.tooltipActive) {
132
- this.tooltip.show();
133
- }
134
- else {
135
- this.tooltip.hide();
136
- }
137
- }
138
- }
139
- CombosComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CombosComponent, deps: [{ token: i1.HttpService }], target: i0.ɵɵFactoryTarget.Component });
140
- CombosComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CombosComponent, selector: "combos", inputs: { dataCombos: "dataCombos", additionalData: "additionalData", configuration: "configuration", filter: "filter", checkbox: "checkbox", required: "required", disabled: "disabled", addFinal: "addFinal", appearance: "appearance", reloadCombo: "reloadCombo", control: "control" }, outputs: { changeOption: "changeOption", changeOptionDataComplete: "changeOptionDataComplete", returnDataCombo: "returnDataCombo" }, viewQueries: [{ propertyName: "tooltip", first: true, predicate: ["tooltip"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div style=\"display: flex; flex-direction: row; justify-content: space-between\">\r\n <div class=\"combo-container\">\r\n\r\n <mat-icon\r\n class=\"m-1 icon-information\"\r\n *ngIf=\"tooltipDescription\"\r\n matTooltip=\"{{tooltipDescription}}\"\r\n matTooltipPosition=\"above\"\r\n #tooltip=\"matTooltip\"\r\n (click)=\"toggleTooltip()\"\r\n matTooltipClass=\"custom-tooltip\"\r\n >info</mat-icon>\r\n\r\n <mat-form-field style=\"width: 100%\" [appearance]=\"appearance\">\r\n <mat-label style=\"text-transform: capitalize\">{{\r\n configuration.label\r\n }}</mat-label>\r\n <mat-select [multiple]=\"checkbox\" (selectionChange)=\"selectedData(control)\" [required]=\"required\"\r\n [formControl]=\"control\" [disabled]=\"disabled\">\r\n <app-select-filter [noResultsMessage]=\"'No hay resultados'\" *ngIf=\"filter\" [placeholder]=\"'Filter'\" [displayMember]=\"configuration.visibleField\"\r\n [array]=\"dataCombos\" (filteredReturn)=\"filteredList = $event\">\r\n </app-select-filter>\r\n <mat-option [value]=\"data[configuration.selectionField]\" *ngFor=\"let data of filteredList\">\r\n {{ data[configuration.visibleField] }}\r\n </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"required\">Campo requerido</mat-error>\r\n </mat-form-field>\r\n </div>\r\n</div>\r\n\r\n", styles: [".mat-form-field{width:100%}.combo-container{width:100%;display:flex;align-items:center}.icon-information{cursor:pointer;color:gray}.mat-icon{font-size:1.1rem}::ng-deep .custom-tooltip{background-color:#fbe870!important;color:#000!important;line-height:17px!important;font-size:.8rem}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i9.SelectFilterComponent, selector: "app-select-filter", inputs: ["array", "placeholder", "color", "displayMember", "showSpinner", "noResultsMessage", "hasGroup", "groupArrayName"], outputs: ["filteredReturn"] }] });
141
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CombosComponent, decorators: [{
142
- type: Component,
143
- args: [{ selector: 'combos', template: "<div style=\"display: flex; flex-direction: row; justify-content: space-between\">\r\n <div class=\"combo-container\">\r\n\r\n <mat-icon\r\n class=\"m-1 icon-information\"\r\n *ngIf=\"tooltipDescription\"\r\n matTooltip=\"{{tooltipDescription}}\"\r\n matTooltipPosition=\"above\"\r\n #tooltip=\"matTooltip\"\r\n (click)=\"toggleTooltip()\"\r\n matTooltipClass=\"custom-tooltip\"\r\n >info</mat-icon>\r\n\r\n <mat-form-field style=\"width: 100%\" [appearance]=\"appearance\">\r\n <mat-label style=\"text-transform: capitalize\">{{\r\n configuration.label\r\n }}</mat-label>\r\n <mat-select [multiple]=\"checkbox\" (selectionChange)=\"selectedData(control)\" [required]=\"required\"\r\n [formControl]=\"control\" [disabled]=\"disabled\">\r\n <app-select-filter [noResultsMessage]=\"'No hay resultados'\" *ngIf=\"filter\" [placeholder]=\"'Filter'\" [displayMember]=\"configuration.visibleField\"\r\n [array]=\"dataCombos\" (filteredReturn)=\"filteredList = $event\">\r\n </app-select-filter>\r\n <mat-option [value]=\"data[configuration.selectionField]\" *ngFor=\"let data of filteredList\">\r\n {{ data[configuration.visibleField] }}\r\n </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"required\">Campo requerido</mat-error>\r\n </mat-form-field>\r\n </div>\r\n</div>\r\n\r\n", styles: [".mat-form-field{width:100%}.combo-container{width:100%;display:flex;align-items:center}.icon-information{cursor:pointer;color:gray}.mat-icon{font-size:1.1rem}::ng-deep .custom-tooltip{background-color:#fbe870!important;color:#000!important;line-height:17px!important;font-size:.8rem}\n"] }]
144
- }], ctorParameters: function () { return [{ type: i1.HttpService }]; }, propDecorators: { dataCombos: [{
145
- type: Input
146
- }], additionalData: [{
147
- type: Input
148
- }], configuration: [{
149
- type: Input
150
- }], filter: [{
151
- type: Input
152
- }], checkbox: [{
153
- type: Input
154
- }], required: [{
155
- type: Input
156
- }], disabled: [{
157
- type: Input
158
- }], addFinal: [{
159
- type: Input
160
- }], appearance: [{
161
- type: Input
162
- }], reloadCombo: [{
163
- type: Input
164
- }], control: [{
165
- type: Input
166
- }], tooltip: [{
167
- type: ViewChild,
168
- args: ['tooltip']
169
- }], changeOption: [{
170
- type: Output
171
- }], changeOptionDataComplete: [{
172
- type: Output
173
- }], returnDataCombo: [{
174
- type: Output
175
- }] } });
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9icmFpbmxvcGVyLXVpL2NvbXBvbmVudHMvY29tYm9zL2NvbWJvcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2NvbWJvcy9jb21ib3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFHWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBUXBELE1BQU0sT0FBTyxlQUFlO0lBdUIxQixZQUFvQixJQUFpQjtRQUFqQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBbkI1QixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUVyQixZQUFPLEdBQXVCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUV6RCx1QkFBa0IsR0FBVyxJQUFJLENBQUM7UUFDbEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFJNUIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3ZDLDZCQUF3QixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDbkQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBR1osQ0FBQztJQUV6QyxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENB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O3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBRVYsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2h0dHAuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjb21ib3MnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvbWJvcy5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tYm9zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGRhdGFDb21ib3M6IEFycmF5PGFueT47XHJcbiAgQElucHV0KCkgYWRkaXRpb25hbERhdGE6IEFycmF5PGFueT47XHJcbiAgQElucHV0KCkgY29uZmlndXJhdGlvbjogQ29tYm9zQ29uZmlndXJhdGlvbjtcclxuICBASW5wdXQoKSBmaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBhZGRGaW5hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IGFueSA9ICcnO1xyXG4gIEBJbnB1dCgpIHJlbG9hZENvbWJvOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBASW5wdXQoKSBjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XHJcblxyXG4gIHB1YmxpYyB0b29sdGlwRGVzY3JpcHRpb246IHN0cmluZyA9IG51bGw7XHJcbiAgcHVibGljIHRvb2x0aXBBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgndG9vbHRpcCcpIHRvb2x0aXA6IE1hdFRvb2x0aXA7XHJcblxyXG4gIEBPdXRwdXQoKSBjaGFuZ2VPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgY2hhbmdlT3B0aW9uRGF0YUNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHJldHVybkRhdGFDb21ibyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBmaWx0ZXJlZExpc3Q6IEFycmF5PGFueT47XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwU2VydmljZSkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5sYWJlbCkge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubGFiZWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZUZpZWxkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5pdERhdGEoKTtcclxuXHJcbiAgICBpZiAodGhpcy5yZWxvYWRDb21ibykge1xyXG4gICAgICB0aGlzLnJlbG9hZENvbWJvLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyA9PSAnc2VsZWN0ZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdGVkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdGVkKTtcclxuICAgIC8vY29uc29sZS5sb2codGhpcy5jb25maWd1cmF0aW9uKVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMuZGF0YUNvbWJvcyAmJiBjaGFuZ2VzPy5kYXRhQ29tYm9zKSB7XHJcbiAgICAgIHRoaXMuZGF0YUNvbWJvcyA9IGNoYW5nZXMuZGF0YUNvbWJvcy5jdXJyZW50VmFsdWU7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5kYXRhQ29tYm9zLnNsaWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdGVkID0gdGhpcy5jb250cm9sLnZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVybENvbWJvKSB7XHJcbiAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YUNvbWJvcykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5kYXRhQ29tYm9zLnNsaWNlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERhdGEoKSB7XHJcbiAgICB0aGlzLmh0dHBcclxuICAgICAgLmdldERhdGEodGhpcy5jb25maWd1cmF0aW9uLnVybENvbWJvLCB0aGlzLmNvbmZpZ3VyYXRpb24udXJsUGFyYW1zKVxyXG4gICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgIChyZXMpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNbJ2NvZGUnXSA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFDb21ib3MgPSByZXNbJ2JvZHknXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYWRkaXRpb25hbERhdGEpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5hZGRGaW5hbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ29tYm9zID0gdGhpcy5kYXRhQ29tYm9zLmNvbmNhdCh0aGlzLmFkZGl0aW9uYWxEYXRhKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ29tYm9zID0gdGhpcy5hZGRpdGlvbmFsRGF0YS5jb25jYXQodGhpcy5kYXRhQ29tYm9zKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZXR1cm5EYXRhQ29tYm8uZW1pdCh0aGlzLmRhdGFDb21ib3MpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuZGF0YUNvbWJvcy5zbGljZSgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGVuIGxhIGNvbnN1bHRhIHBhcmEgZGF0b3MgY29tYm8nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWREYXRhKCRldmVudCkge1xyXG4gICAgdGhpcy5maW5kRGF0YSgkZXZlbnQpO1xyXG4gICAgdGhpcy5jaGFuZ2VPcHRpb24uZW1pdCgkZXZlbnQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZmluZERhdGEoJGV2ZW50KSB7XHJcbiAgICBsZXQgZCA9IFtdO1xyXG4gICAgaWYgKHRoaXMuY2hlY2tib3gpIHtcclxuICAgICAgY29uc3QgbG9va3VwID0gbmV3IE1hcChcclxuICAgICAgICB0aGlzLmRhdGFDb21ib3MubWFwKChpdGVtKSA9PiBbXHJcbiAgICAgICAgICBpdGVtW3RoaXMuY29uZmlndXJhdGlvbi5zZWxlY3Rpb25GaWVsZF0sXHJcbiAgICAgICAgICBpdGVtLFxyXG4gICAgICAgIF0pXHJcbiAgICAgICk7XHJcbiAgICAgIGZvciAoY29uc3QgaWQgb2YgJGV2ZW50LnZhbHVlKSB7XHJcbiAgICAgICAgY29uc3QgZm91bmRJdGVtID0gbG9va3VwLmdldChpZCk7XHJcbiAgICAgICAgaWYgKGZvdW5kSXRlbSkge1xyXG4gICAgICAgICAgZC5wdXNoKGZvdW5kSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkID0gdGhpcy5kYXRhQ29tYm9zLmZpbmQoXHJcbiAgICAgICAgKHgpID0+IHhbdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdGlvbkZpZWxkXSA9PSAkZXZlbnQudmFsdWVcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlT3B0aW9uRGF0YUNvbXBsZXRlLmVtaXQoZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5maWxlVG9vbHRpcCAmJiAhdGhpcy5jaGVja2JveCkge1xyXG4gICAgICBpZiAoZCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcERlc2NyaXB0aW9uID0gZFt0aGlzLmNvbmZpZ3VyYXRpb24uZmlsZVRvb2x0aXBdO1xyXG4gICAgICAgIHRoaXMudG9vbHRpcEFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvb2x0aXAuc2hvdygpO1xyXG4gICAgICAgIH0sIDUwKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XHJcbiAgICAgICAgfSwgMTAwMDApO1xyXG4gICAgICB9IGVsc2UgdGhpcy50b29sdGlwRGVzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgfSBlbHNlIHRoaXMudG9vbHRpcERlc2NyaXB0aW9uID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVRvb2x0aXAoKSB7XHJcbiAgICB0aGlzLnRvb2x0aXBBY3RpdmUgPSAhdGhpcy50b29sdGlwQWN0aXZlO1xyXG4gICAgaWYgKHRoaXMudG9vbHRpcEFjdGl2ZSkge1xyXG4gICAgICB0aGlzLnRvb2x0aXAuc2hvdygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50b29sdGlwLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBDb21ib3NDb25maWd1cmF0aW9uIHtcclxuICBzZWxlY3Rpb25GaWVsZD86IHN0cmluZztcclxuICB2aXNpYmxlRmllbGQ/OiBzdHJpbmc7XHJcbiAgdXJsQ29tYm8/OiBzdHJpbmc7XHJcbiAgdXJsUGFyYW1zPzogYW55W107XHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWQ/OiBhbnk7XHJcbiAgZmlsZVRvb2x0aXA/OiBzdHJpbmc7XHJcbn1cclxuIiwiPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlblwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb21iby1jb250YWluZXJcIj5cclxuXHJcbiAgICA8bWF0LWljb25cclxuICAgICAgY2xhc3M9XCJtLTEgaWNvbi1pbmZvcm1hdGlvblwiXHJcbiAgICAgICpuZ0lmPVwidG9vbHRpcERlc2NyaXB0aW9uXCJcclxuICAgICAgbWF0VG9vbHRpcD1cInt7dG9vbHRpcERlc2NyaXB0aW9ufX1cIlxyXG4gICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXHJcbiAgICAgICN0b29sdGlwPVwibWF0VG9vbHRpcFwiXHJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVUb29sdGlwKClcIlxyXG4gICAgICBtYXRUb29sdGlwQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiXHJcbiAgICAgPmluZm88L21hdC1pY29uPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBzdHlsZT1cIndpZHRoOiAxMDAlXCIgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemVcIj57e1xyXG4gICAgICAgIGNvbmZpZ3VyYXRpb24ubGFiZWxcclxuICAgICAgICB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBbbXVsdGlwbGVdPVwiY2hlY2tib3hcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdGVkRGF0YShjb250cm9sKVwiIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgICAgICA8YXBwLXNlbGVjdC1maWx0ZXIgW25vUmVzdWx0c01lc3NhZ2VdPVwiJ05vIGhheSByZXN1bHRhZG9zJ1wiICpuZ0lmPVwiZmlsdGVyXCIgW3BsYWNlaG9sZGVyXT1cIidGaWx0ZXInXCIgW2Rpc3BsYXlNZW1iZXJdPVwiY29uZmlndXJhdGlvbi52aXNpYmxlRmllbGRcIlxyXG4gICAgICAgICAgW2FycmF5XT1cImRhdGFDb21ib3NcIiAoZmlsdGVyZWRSZXR1cm4pPVwiZmlsdGVyZWRMaXN0ID0gJGV2ZW50XCI+XHJcbiAgICAgICAgPC9hcHAtc2VsZWN0LWZpbHRlcj5cclxuICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZGF0YVtjb25maWd1cmF0aW9uLnNlbGVjdGlvbkZpZWxkXVwiICpuZ0Zvcj1cImxldCBkYXRhIG9mIGZpbHRlcmVkTGlzdFwiPlxyXG4gICAgICAgICAge3sgZGF0YVtjb25maWd1cmF0aW9uLnZpc2libGVGaWVsZF0gfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJlcXVpcmVkXCI+Q2FtcG8gcmVxdWVyaWRvPC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbiJdfQ==
1
+ import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
2
+ import { UntypedFormControl } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../../services/http.service";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "@angular/material/icon";
7
+ import * as i4 from "@angular/material/form-field";
8
+ import * as i5 from "@angular/material/select";
9
+ import * as i6 from "@angular/material/core";
10
+ import * as i7 from "@angular/material/tooltip";
11
+ import * as i8 from "@angular/forms";
12
+ import * as i9 from "../select-filter/select-filter.component";
13
+ export class CombosComponent {
14
+ constructor(http) {
15
+ this.http = http;
16
+ this.filter = false;
17
+ this.checkbox = false;
18
+ this.required = false;
19
+ this.disabled = false;
20
+ this.addFinal = false;
21
+ this.appearance = '';
22
+ this.control = new UntypedFormControl();
23
+ this.tooltipDescription = null;
24
+ this.tooltipActive = false;
25
+ this.changeOption = new EventEmitter();
26
+ this.changeOptionDataComplete = new EventEmitter();
27
+ this.returnDataCombo = new EventEmitter();
28
+ }
29
+ ngOnInit() {
30
+ if (!this.configuration.label) {
31
+ this.configuration.label = this.configuration.visibleField;
32
+ }
33
+ this.initData();
34
+ if (this.reloadCombo) {
35
+ this.reloadCombo.subscribe((res) => {
36
+ if (res == 'selected') {
37
+ this.control.setValue(this.configuration.selected);
38
+ }
39
+ else {
40
+ this.initData();
41
+ }
42
+ });
43
+ }
44
+ this.control.setValue(this.configuration.selected);
45
+ //console.log(this.configuration)
46
+ }
47
+ ngOnChanges(changes) {
48
+ if (this.dataCombos && changes?.dataCombos) {
49
+ this.dataCombos = changes.dataCombos.currentValue;
50
+ this.filteredList = this.dataCombos.slice();
51
+ }
52
+ if (this.control && this.control.value) {
53
+ this.configuration.selected = this.control.value;
54
+ }
55
+ }
56
+ initData() {
57
+ if (this.configuration.urlCombo) {
58
+ this.getData();
59
+ }
60
+ else {
61
+ if (this.dataCombos) {
62
+ this.filteredList = this.dataCombos.slice();
63
+ }
64
+ }
65
+ }
66
+ getData() {
67
+ this.http
68
+ .getData(this.configuration.urlCombo, this.configuration.urlParams)
69
+ .subscribe((res) => {
70
+ if (res['code'] === 0) {
71
+ this.dataCombos = res['body'];
72
+ if (this.additionalData) {
73
+ if (this.addFinal) {
74
+ this.dataCombos = this.dataCombos.concat(this.additionalData);
75
+ }
76
+ else {
77
+ this.dataCombos = this.additionalData.concat(this.dataCombos);
78
+ }
79
+ }
80
+ this.returnDataCombo.emit(this.dataCombos);
81
+ this.filteredList = this.dataCombos.slice();
82
+ }
83
+ else {
84
+ console.log('error en la consulta para datos combo');
85
+ }
86
+ }, (err) => {
87
+ console.log(err);
88
+ });
89
+ }
90
+ selectedData($event) {
91
+ this.findData($event);
92
+ this.changeOption.emit($event.value);
93
+ }
94
+ findData($event) {
95
+ let d = [];
96
+ if (this.checkbox) {
97
+ const lookup = new Map(this.dataCombos.map((item) => [
98
+ item[this.configuration.selectionField],
99
+ item,
100
+ ]));
101
+ for (const id of $event.value) {
102
+ const foundItem = lookup.get(id);
103
+ if (foundItem) {
104
+ d.push(foundItem);
105
+ }
106
+ }
107
+ }
108
+ else {
109
+ d = this.dataCombos.find((x) => x[this.configuration.selectionField] == $event.value);
110
+ }
111
+ this.changeOptionDataComplete.emit(d);
112
+ if (this.configuration.fileTooltip && !this.checkbox) {
113
+ if (d) {
114
+ this.tooltipDescription = d[this.configuration.fileTooltip];
115
+ this.tooltipActive = true;
116
+ setTimeout(() => {
117
+ this.tooltip.show();
118
+ }, 50);
119
+ setTimeout(() => {
120
+ this.tooltip.hide();
121
+ }, 10000);
122
+ }
123
+ else
124
+ this.tooltipDescription = null;
125
+ }
126
+ else
127
+ this.tooltipDescription = null;
128
+ }
129
+ toggleTooltip() {
130
+ this.tooltipActive = !this.tooltipActive;
131
+ if (this.tooltipActive) {
132
+ this.tooltip.show();
133
+ }
134
+ else {
135
+ this.tooltip.hide();
136
+ }
137
+ }
138
+ }
139
+ CombosComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CombosComponent, deps: [{ token: i1.HttpService }], target: i0.ɵɵFactoryTarget.Component });
140
+ CombosComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CombosComponent, selector: "combos", inputs: { dataCombos: "dataCombos", additionalData: "additionalData", configuration: "configuration", filter: "filter", checkbox: "checkbox", required: "required", disabled: "disabled", addFinal: "addFinal", appearance: "appearance", reloadCombo: "reloadCombo", control: "control" }, outputs: { changeOption: "changeOption", changeOptionDataComplete: "changeOptionDataComplete", returnDataCombo: "returnDataCombo" }, viewQueries: [{ propertyName: "tooltip", first: true, predicate: ["tooltip"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div style=\"display: flex; flex-direction: row; justify-content: space-between\">\n <div class=\"combo-container\">\n\n <mat-icon\n class=\"m-1 icon-information\"\n *ngIf=\"tooltipDescription\"\n matTooltip=\"{{tooltipDescription}}\"\n matTooltipPosition=\"above\"\n #tooltip=\"matTooltip\"\n (click)=\"toggleTooltip()\"\n matTooltipClass=\"custom-tooltip\"\n >info</mat-icon>\n\n <mat-form-field style=\"width: 100%\" [appearance]=\"appearance\">\n <mat-label style=\"text-transform: capitalize\">{{\n configuration.label\n }}</mat-label>\n <mat-select [multiple]=\"checkbox\" (selectionChange)=\"selectedData(control)\" [required]=\"required\"\n [formControl]=\"control\" [disabled]=\"disabled\">\n <app-select-filter [noResultsMessage]=\"'No hay resultados'\" *ngIf=\"filter\" [placeholder]=\"'Filter'\" [displayMember]=\"configuration.visibleField\"\n [array]=\"dataCombos\" (filteredReturn)=\"filteredList = $event\">\n </app-select-filter>\n <mat-option [value]=\"data[configuration.selectionField]\" *ngFor=\"let data of filteredList\">\n {{ data[configuration.visibleField] }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"required\">Campo requerido</mat-error>\n </mat-form-field>\n </div>\n</div>\n\n", styles: [".mat-form-field{width:100%}.combo-container{width:100%;display:flex;align-items:center}.icon-information{cursor:pointer;color:gray}.mat-icon{font-size:1.1rem}::ng-deep .custom-tooltip{background-color:#fbe870!important;color:#000!important;line-height:17px!important;font-size:.8rem}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i9.SelectFilterComponent, selector: "app-select-filter", inputs: ["array", "placeholder", "color", "displayMember", "showSpinner", "noResultsMessage", "hasGroup", "groupArrayName"], outputs: ["filteredReturn"] }] });
141
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CombosComponent, decorators: [{
142
+ type: Component,
143
+ args: [{ selector: 'combos', template: "<div style=\"display: flex; flex-direction: row; justify-content: space-between\">\n <div class=\"combo-container\">\n\n <mat-icon\n class=\"m-1 icon-information\"\n *ngIf=\"tooltipDescription\"\n matTooltip=\"{{tooltipDescription}}\"\n matTooltipPosition=\"above\"\n #tooltip=\"matTooltip\"\n (click)=\"toggleTooltip()\"\n matTooltipClass=\"custom-tooltip\"\n >info</mat-icon>\n\n <mat-form-field style=\"width: 100%\" [appearance]=\"appearance\">\n <mat-label style=\"text-transform: capitalize\">{{\n configuration.label\n }}</mat-label>\n <mat-select [multiple]=\"checkbox\" (selectionChange)=\"selectedData(control)\" [required]=\"required\"\n [formControl]=\"control\" [disabled]=\"disabled\">\n <app-select-filter [noResultsMessage]=\"'No hay resultados'\" *ngIf=\"filter\" [placeholder]=\"'Filter'\" [displayMember]=\"configuration.visibleField\"\n [array]=\"dataCombos\" (filteredReturn)=\"filteredList = $event\">\n </app-select-filter>\n <mat-option [value]=\"data[configuration.selectionField]\" *ngFor=\"let data of filteredList\">\n {{ data[configuration.visibleField] }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"required\">Campo requerido</mat-error>\n </mat-form-field>\n </div>\n</div>\n\n", styles: [".mat-form-field{width:100%}.combo-container{width:100%;display:flex;align-items:center}.icon-information{cursor:pointer;color:gray}.mat-icon{font-size:1.1rem}::ng-deep .custom-tooltip{background-color:#fbe870!important;color:#000!important;line-height:17px!important;font-size:.8rem}\n"] }]
144
+ }], ctorParameters: function () { return [{ type: i1.HttpService }]; }, propDecorators: { dataCombos: [{
145
+ type: Input
146
+ }], additionalData: [{
147
+ type: Input
148
+ }], configuration: [{
149
+ type: Input
150
+ }], filter: [{
151
+ type: Input
152
+ }], checkbox: [{
153
+ type: Input
154
+ }], required: [{
155
+ type: Input
156
+ }], disabled: [{
157
+ type: Input
158
+ }], addFinal: [{
159
+ type: Input
160
+ }], appearance: [{
161
+ type: Input
162
+ }], reloadCombo: [{
163
+ type: Input
164
+ }], control: [{
165
+ type: Input
166
+ }], tooltip: [{
167
+ type: ViewChild,
168
+ args: ['tooltip']
169
+ }], changeOption: [{
170
+ type: Output
171
+ }], changeOptionDataComplete: [{
172
+ type: Output
173
+ }], returnDataCombo: [{
174
+ type: Output
175
+ }] } });
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9icmFpbmxvcGVyLXVpL2NvbXBvbmVudHMvY29tYm9zL2NvbWJvcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2NvbWJvcy9jb21ib3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFHWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBUXBELE1BQU0sT0FBTyxlQUFlO0lBdUIxQixZQUFvQixJQUFpQjtRQUFqQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBbkI1QixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUVyQixZQUFPLEdBQXVCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUV6RCx1QkFBa0IsR0FBVyxJQUFJLENBQUM7UUFDbEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFJNUIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3ZDLDZCQUF3QixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDbkQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBR1osQ0FBQztJQUV6QyxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENB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O3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBRVYsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIE9uQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHR0cC5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvbWJvcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21ib3MuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tYm9zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkYXRhQ29tYm9zOiBBcnJheTxhbnk+O1xuICBASW5wdXQoKSBhZGRpdGlvbmFsRGF0YTogQXJyYXk8YW55PjtcbiAgQElucHV0KCkgY29uZmlndXJhdGlvbjogQ29tYm9zQ29uZmlndXJhdGlvbjtcbiAgQElucHV0KCkgZmlsdGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFkZEZpbmFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IGFueSA9ICcnO1xuICBASW5wdXQoKSByZWxvYWRDb21ibzogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBJbnB1dCgpIGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcblxuICBwdWJsaWMgdG9vbHRpcERlc2NyaXB0aW9uOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgdG9vbHRpcEFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3Rvb2x0aXAnKSB0b29sdGlwOiBNYXRUb29sdGlwO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGNoYW5nZU9wdGlvbkRhdGFDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcmV0dXJuRGF0YUNvbWJvID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZmlsdGVyZWRMaXN0OiBBcnJheTxhbnk+O1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmxhYmVsKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubGFiZWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZUZpZWxkO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdERhdGEoKTtcblxuICAgIGlmICh0aGlzLnJlbG9hZENvbWJvKSB7XG4gICAgICB0aGlzLnJlbG9hZENvbWJvLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMgPT0gJ3NlbGVjdGVkJykge1xuICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW5pdERhdGEoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWQpO1xuICAgIC8vY29uc29sZS5sb2codGhpcy5jb25maWd1cmF0aW9uKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLmRhdGFDb21ib3MgJiYgY2hhbmdlcz8uZGF0YUNvbWJvcykge1xuICAgICAgdGhpcy5kYXRhQ29tYm9zID0gY2hhbmdlcy5kYXRhQ29tYm9zLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5kYXRhQ29tYm9zLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udHJvbCAmJiB0aGlzLmNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RlZCA9IHRoaXMuY29udHJvbC52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBpbml0RGF0YSgpIHtcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVybENvbWJvKSB7XG4gICAgICB0aGlzLmdldERhdGEoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZGF0YUNvbWJvcykge1xuICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuZGF0YUNvbWJvcy5zbGljZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldERhdGEoKSB7XG4gICAgdGhpcy5odHRwXG4gICAgICAuZ2V0RGF0YSh0aGlzLmNvbmZpZ3VyYXRpb24udXJsQ29tYm8sIHRoaXMuY29uZmlndXJhdGlvbi51cmxQYXJhbXMpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc1snY29kZSddID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFDb21ib3MgPSByZXNbJ2JvZHknXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZGl0aW9uYWxEYXRhKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmFkZEZpbmFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ29tYm9zID0gdGhpcy5kYXRhQ29tYm9zLmNvbmNhdCh0aGlzLmFkZGl0aW9uYWxEYXRhKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFDb21ib3MgPSB0aGlzLmFkZGl0aW9uYWxEYXRhLmNvbmNhdCh0aGlzLmRhdGFDb21ib3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJldHVybkRhdGFDb21iby5lbWl0KHRoaXMuZGF0YUNvbWJvcyk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IHRoaXMuZGF0YUNvbWJvcy5zbGljZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgZW4gbGEgY29uc3VsdGEgcGFyYSBkYXRvcyBjb21ibycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBzZWxlY3RlZERhdGEoJGV2ZW50KSB7XG4gICAgdGhpcy5maW5kRGF0YSgkZXZlbnQpO1xuICAgIHRoaXMuY2hhbmdlT3B0aW9uLmVtaXQoJGV2ZW50LnZhbHVlKTtcbiAgfVxuXG4gIGZpbmREYXRhKCRldmVudCkge1xuICAgIGxldCBkID0gW107XG4gICAgaWYgKHRoaXMuY2hlY2tib3gpIHtcbiAgICAgIGNvbnN0IGxvb2t1cCA9IG5ldyBNYXAoXG4gICAgICAgIHRoaXMuZGF0YUNvbWJvcy5tYXAoKGl0ZW0pID0+IFtcbiAgICAgICAgICBpdGVtW3RoaXMuY29uZmlndXJhdGlvbi5zZWxlY3Rpb25GaWVsZF0sXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgXSlcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGlkIG9mICRldmVudC52YWx1ZSkge1xuICAgICAgICBjb25zdCBmb3VuZEl0ZW0gPSBsb29rdXAuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGZvdW5kSXRlbSkge1xuICAgICAgICAgIGQucHVzaChmb3VuZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGQgPSB0aGlzLmRhdGFDb21ib3MuZmluZChcbiAgICAgICAgKHgpID0+IHhbdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdGlvbkZpZWxkXSA9PSAkZXZlbnQudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlT3B0aW9uRGF0YUNvbXBsZXRlLmVtaXQoZCk7XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmZpbGVUb29sdGlwICYmICF0aGlzLmNoZWNrYm94KSB7XG4gICAgICBpZiAoZCkge1xuICAgICAgICB0aGlzLnRvb2x0aXBEZXNjcmlwdGlvbiA9IGRbdGhpcy5jb25maWd1cmF0aW9uLmZpbGVUb29sdGlwXTtcbiAgICAgICAgdGhpcy50b29sdGlwQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy50b29sdGlwLnNob3coKTtcbiAgICAgICAgfSwgNTApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xuICAgICAgICB9LCAxMDAwMCk7XG4gICAgICB9IGVsc2UgdGhpcy50b29sdGlwRGVzY3JpcHRpb24gPSBudWxsO1xuICAgIH0gZWxzZSB0aGlzLnRvb2x0aXBEZXNjcmlwdGlvbiA9IG51bGw7XG4gIH1cblxuICB0b2dnbGVUb29sdGlwKCkge1xuICAgIHRoaXMudG9vbHRpcEFjdGl2ZSA9ICF0aGlzLnRvb2x0aXBBY3RpdmU7XG4gICAgaWYgKHRoaXMudG9vbHRpcEFjdGl2ZSkge1xuICAgICAgdGhpcy50b29sdGlwLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b29sdGlwLmhpZGUoKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIENvbWJvc0NvbmZpZ3VyYXRpb24ge1xuICBzZWxlY3Rpb25GaWVsZD86IHN0cmluZztcbiAgdmlzaWJsZUZpZWxkPzogc3RyaW5nO1xuICB1cmxDb21ibz86IHN0cmluZztcbiAgdXJsUGFyYW1zPzogYW55W107XG4gIGxhYmVsPzogc3RyaW5nO1xuICBzZWxlY3RlZD86IGFueTtcbiAgZmlsZVRvb2x0aXA/OiBzdHJpbmc7XG59XG4iLCI8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuXCI+XG4gIDxkaXYgY2xhc3M9XCJjb21iby1jb250YWluZXJcIj5cblxuICAgIDxtYXQtaWNvblxuICAgICAgY2xhc3M9XCJtLTEgaWNvbi1pbmZvcm1hdGlvblwiXG4gICAgICAqbmdJZj1cInRvb2x0aXBEZXNjcmlwdGlvblwiXG4gICAgICBtYXRUb29sdGlwPVwie3t0b29sdGlwRGVzY3JpcHRpb259fVwiXG4gICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAjdG9vbHRpcD1cIm1hdFRvb2x0aXBcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZVRvb2x0aXAoKVwiXG4gICAgICBtYXRUb29sdGlwQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiXG4gICAgID5pbmZvPC9tYXQtaWNvbj5cblxuICAgIDxtYXQtZm9ybS1maWVsZCBzdHlsZT1cIndpZHRoOiAxMDAlXCIgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiPlxuICAgICAgPG1hdC1sYWJlbCBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplXCI+e3tcbiAgICAgICAgY29uZmlndXJhdGlvbi5sYWJlbFxuICAgICAgICB9fTwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1zZWxlY3QgW211bHRpcGxlXT1cImNoZWNrYm94XCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3RlZERhdGEoY29udHJvbClcIiBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8YXBwLXNlbGVjdC1maWx0ZXIgW25vUmVzdWx0c01lc3NhZ2VdPVwiJ05vIGhheSByZXN1bHRhZG9zJ1wiICpuZ0lmPVwiZmlsdGVyXCIgW3BsYWNlaG9sZGVyXT1cIidGaWx0ZXInXCIgW2Rpc3BsYXlNZW1iZXJdPVwiY29uZmlndXJhdGlvbi52aXNpYmxlRmllbGRcIlxuICAgICAgICAgIFthcnJheV09XCJkYXRhQ29tYm9zXCIgKGZpbHRlcmVkUmV0dXJuKT1cImZpbHRlcmVkTGlzdCA9ICRldmVudFwiPlxuICAgICAgICA8L2FwcC1zZWxlY3QtZmlsdGVyPlxuICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZGF0YVtjb25maWd1cmF0aW9uLnNlbGVjdGlvbkZpZWxkXVwiICpuZ0Zvcj1cImxldCBkYXRhIG9mIGZpbHRlcmVkTGlzdFwiPlxuICAgICAgICAgIHt7IGRhdGFbY29uZmlndXJhdGlvbi52aXNpYmxlRmllbGRdIH19XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyZXF1aXJlZFwiPkNhbXBvIHJlcXVlcmlkbzwvbWF0LWVycm9yPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==