brainloper-ui 14.1.4 → 14.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/brainloper-ui.mjs +4 -4
- package/esm2020/public_api.mjs +56 -56
- package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +310 -310
- package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +29 -29
- package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +23 -23
- package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +83 -83
- package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +40 -40
- package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +176 -176
- package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +728 -728
- package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +118 -118
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +186 -186
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.mjs +1 -1
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.mjs +1 -1
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.mjs +1 -1
- package/esm2020/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +222 -222
- package/esm2020/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.mjs +81 -80
- package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +82 -81
- package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +108 -108
- package/esm2020/src/app/modules/directives/carousel-item.directive.mjs +18 -18
- package/esm2020/src/app/modules/interfaces/buttons/button-icon.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/combos/combos-configuration.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/data-table/params.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/data-table/rules.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/data-table/table-columns.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/data-table/table-configuration.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/enum/enumActions.mjs +8 -8
- package/esm2020/src/app/modules/interfaces/enum/enumRules.mjs +8 -8
- package/esm2020/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/file-forms-service/file-input-params.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/filters/header-filters.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +8 -8
- package/esm2020/src/app/modules/interfaces/report/template-pdf-base.mjs +2 -0
- package/esm2020/src/app/modules/interfaces/report/template-pdf-ot.mjs +2 -2
- package/esm2020/src/app/modules/interfaces/report/template-pfd-fo.mjs +2 -2
- package/esm2020/src/app/modules/services/crypto.service.mjs +37 -37
- package/esm2020/src/app/modules/services/export-data.service.mjs +166 -166
- package/esm2020/src/app/modules/services/file-forms.service.mjs +24 -24
- package/esm2020/src/app/modules/services/functions.service.mjs +54 -54
- package/esm2020/src/app/modules/services/generate-pdf.service.mjs +58 -58
- package/esm2020/src/app/modules/services/http.service.mjs +97 -97
- package/esm2020/src/app/modules/services/loading/loading.component.mjs +28 -28
- package/esm2020/src/app/modules/services/local-storage.service.mjs +115 -115
- package/esm2020/src/app/modules/services/message.service.mjs +200 -200
- package/esm2020/src/app/modules/services/screen-size-util.mjs +6 -6
- package/esm2020/src/app/modules/services/session.service.mjs +42 -42
- package/fesm2015/brainloper-ui.mjs +2814 -2812
- package/fesm2015/brainloper-ui.mjs.map +1 -1
- package/fesm2020/brainloper-ui.mjs +2774 -2772
- package/fesm2020/brainloper-ui.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/package.json +1 -1
- package/public_api.d.ts +55 -55
- package/src/app/modules/brainloper-ui/brainloper-ui.module.d.ts +62 -62
- package/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.d.ts +13 -13
- package/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.d.ts +10 -10
- package/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.d.ts +24 -24
- package/src/app/modules/brainloper-ui/components/carousel/carousel.component.d.ts +16 -16
- package/src/app/modules/brainloper-ui/components/combos/combos.component.d.ts +46 -46
- package/src/app/modules/brainloper-ui/components/data-table/data-table.component.d.ts +125 -125
- package/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.d.ts +21 -21
- package/src/app/modules/brainloper-ui/components/file-input/file-input.component.d.ts +42 -42
- package/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.d.ts +2 -2
- package/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.d.ts +2 -2
- package/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.d.ts +2 -2
- package/src/app/modules/brainloper-ui/components/filters/filters.component.d.ts +30 -30
- package/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.d.ts +36 -35
- package/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.d.ts +37 -36
- package/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.d.ts +26 -26
- package/src/app/modules/directives/carousel-item.directive.d.ts +9 -9
- package/src/app/modules/interfaces/buttons/button-icon.d.ts +9 -9
- package/src/app/modules/interfaces/buttons/button-lavel-edit.d.ts +6 -6
- package/src/app/modules/interfaces/combos/combos-configuration.d.ts +13 -13
- package/src/app/modules/interfaces/data-table/params.d.ts +7 -7
- package/src/app/modules/interfaces/data-table/rules.d.ts +8 -8
- package/src/app/modules/interfaces/data-table/table-columns.d.ts +25 -25
- package/src/app/modules/interfaces/data-table/table-configuration.d.ts +26 -26
- package/src/app/modules/interfaces/enum/enumActions.d.ts +6 -6
- package/src/app/modules/interfaces/enum/enumRules.d.ts +6 -6
- package/src/app/modules/interfaces/file-forms-service/file-forms-params.d.ts +4 -4
- package/src/app/modules/interfaces/file-forms-service/file-input-params.d.ts +13 -13
- package/src/app/modules/interfaces/filters/header-filters.d.ts +13 -13
- package/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.d.ts +10 -10
- package/src/app/modules/interfaces/report/template-pdf-base.d.ts +17 -0
- package/src/app/modules/interfaces/report/template-pdf-ot.d.ts +6 -19
- package/src/app/modules/interfaces/report/template-pfd-fo.d.ts +7 -20
- package/src/app/modules/services/crypto.service.d.ts +10 -10
- package/src/app/modules/services/export-data.service.d.ts +18 -18
- package/src/app/modules/services/file-forms.service.d.ts +7 -7
- package/src/app/modules/services/functions.service.d.ts +13 -13
- package/src/app/modules/services/generate-pdf.service.d.ts +12 -12
- package/src/app/modules/services/http.service.d.ts +22 -22
- package/src/app/modules/services/loading/loading.component.d.ts +15 -15
- package/src/app/modules/services/local-storage.service.d.ts +49 -49
- package/src/app/modules/services/message.service.d.ts +23 -23
- package/src/app/modules/services/screen-size-util.d.ts +3 -3
- 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\">\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}@media (max-width: 400px){combo-container{width:100%;justify-content:center;padding-left:8px;padding-right:8px}.mat-form-field{width:100%!important;min-width:120px;max-width:100vw;font-size:14px}.mat-select{font-size:14px}}\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}@media (max-width: 400px){combo-container{width:100%;justify-content:center;padding-left:8px;padding-right:8px}.mat-form-field{width:100%!important;min-width:120px;max-width:100vw;font-size:14px}.mat-select{font-size:14px}}\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==
|
|
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}@media (max-width: 400px){combo-container{width:100%;justify-content:center;padding-left:8px;padding-right:8px}.mat-form-field{width:100%!important;min-width:120px;max-width:100vw;font-size:14px}.mat-select{font-size:14px}}\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}@media (max-width: 400px){combo-container{width:100%;justify-content:center;padding-left:8px;padding-right:8px}.mat-form-field{width:100%!important;min-width:120px;max-width:100vw;font-size:14px}.mat-select{font-size:14px}}\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==
|