brainloper-ui 14.0.30 → 14.0.32
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 +55 -55
- package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +309 -309
- package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +28 -28
- package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +22 -22
- package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +82 -82
- package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +36 -36
- package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +175 -175
- package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +728 -719
- package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +117 -117
- package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +186 -185
- 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 +221 -221
- package/esm2020/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.mjs +79 -79
- package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +80 -80
- package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +107 -107
- package/esm2020/src/app/modules/directives/carousel-item.directive.mjs +17 -17
- package/esm2020/src/app/modules/interfaces/buttons/button-icon.mjs +1 -1
- package/esm2020/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +1 -1
- package/esm2020/src/app/modules/interfaces/combos/combos-configuration.mjs +1 -1
- package/esm2020/src/app/modules/interfaces/data-table/params.mjs +1 -1
- package/esm2020/src/app/modules/interfaces/data-table/rules.mjs +1 -1
- package/esm2020/src/app/modules/interfaces/data-table/table-columns.mjs +1 -1
- package/esm2020/src/app/modules/interfaces/data-table/table-configuration.mjs +1 -1
- package/esm2020/src/app/modules/interfaces/enum/enumActions.mjs +7 -7
- package/esm2020/src/app/modules/interfaces/enum/enumRules.mjs +7 -7
- package/esm2020/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +1 -1
- 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 +1 -1
- package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +7 -7
- package/esm2020/src/app/modules/interfaces/report/template-pdf-ot.mjs +1 -1
- package/esm2020/src/app/modules/interfaces/report/template-pfd-fo.mjs +1 -1
- package/esm2020/src/app/modules/services/crypto.service.mjs +36 -36
- package/esm2020/src/app/modules/services/export-data.service.mjs +166 -166
- package/esm2020/src/app/modules/services/file-forms.service.mjs +23 -23
- package/esm2020/src/app/modules/services/functions.service.mjs +53 -53
- package/esm2020/src/app/modules/services/generate-pdf.service.mjs +57 -57
- package/esm2020/src/app/modules/services/http.service.mjs +96 -96
- package/esm2020/src/app/modules/services/loading/loading.component.mjs +27 -27
- package/esm2020/src/app/modules/services/local-storage.service.mjs +114 -114
- package/esm2020/src/app/modules/services/message.service.mjs +199 -199
- package/esm2020/src/app/modules/services/screen-size-util.mjs +5 -5
- package/esm2020/src/app/modules/services/session.service.mjs +41 -41
- package/fesm2015/brainloper-ui.mjs +2809 -2799
- package/fesm2015/brainloper-ui.mjs.map +1 -1
- package/fesm2020/brainloper-ui.mjs +2769 -2759
- 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 +74 -74
- 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 +15 -15
- 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 +35 -35
- package/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.d.ts +36 -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-ot.d.ts +19 -19
- package/src/app/modules/interfaces/report/template-pfd-fo.d.ts +20 -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,118 +1,118 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms';
|
|
4
|
-
import { forkJoin } from 'rxjs';
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/material/dialog";
|
|
8
|
-
import * as i2 from "@angular/forms";
|
|
9
|
-
import * as i3 from "../../../../services/http.service";
|
|
10
|
-
import * as i4 from "@angular/common";
|
|
11
|
-
import * as i5 from "@angular/material/button";
|
|
12
|
-
import * as i6 from "@angular/material/form-field";
|
|
13
|
-
import * as i7 from "@angular/material/input";
|
|
14
|
-
import * as i8 from "@angular/material/select";
|
|
15
|
-
import * as i9 from "@angular/material/core";
|
|
16
|
-
export class TableModalComponent {
|
|
17
|
-
constructor(dialogRef, data, formBuilder, http) {
|
|
18
|
-
this.dialogRef = dialogRef;
|
|
19
|
-
this.data = data;
|
|
20
|
-
this.formBuilder = formBuilder;
|
|
21
|
-
this.http = http;
|
|
22
|
-
this.modalForm = new UntypedFormGroup({});
|
|
23
|
-
this.dataCombo = {};
|
|
24
|
-
}
|
|
25
|
-
onNoClick() {
|
|
26
|
-
this.dialogRef.close();
|
|
27
|
-
}
|
|
28
|
-
ngOnInit() {
|
|
29
|
-
let group = {};
|
|
30
|
-
let httpRequests = [];
|
|
31
|
-
this.data.columns.map((element) => {
|
|
32
|
-
if (element.type === 'currency') {
|
|
33
|
-
element.value = element.value ? element.value.replace(/\./g, '') : '';
|
|
34
|
-
element.type = 'number';
|
|
35
|
-
}
|
|
36
|
-
if (!element.disregardForAdd) {
|
|
37
|
-
if (element.type === 'combo') {
|
|
38
|
-
this.dataCombo[element.paramsCombo.selectionField !== element.ID ? element.paramsCombo.selectionField : element.ID] = '';
|
|
39
|
-
}
|
|
40
|
-
let initialValue = this.data.action === 'edit' ? element.value : '';
|
|
41
|
-
if (element.type === 'date' && element.value) {
|
|
42
|
-
let s = element.value.split('/');
|
|
43
|
-
initialValue = `${s[2]}-${s[1]}-${s[0]}`;
|
|
44
|
-
}
|
|
45
|
-
group[element.ID] = element.required ? new UntypedFormControl(initialValue, Validators.required) : new UntypedFormControl(initialValue);
|
|
46
|
-
if (element.paramsCombo) {
|
|
47
|
-
httpRequests.push(this.createHttpRequest(element, group));
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
if (httpRequests.length > 0) {
|
|
52
|
-
forkJoin(httpRequests).subscribe(() => {
|
|
53
|
-
this.modalForm = new UntypedFormGroup(group);
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
this.modalForm = new UntypedFormGroup(group);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// Extraemos la creación de la solicitud HTTP a su propia función para mejorar la legibilidad
|
|
61
|
-
createHttpRequest(element, group) {
|
|
62
|
-
return this.http
|
|
63
|
-
.getData(element.paramsCombo.url, element.paramsCombo.urlParams)
|
|
64
|
-
.pipe(map((res) => {
|
|
65
|
-
if (res['code'] === 0) {
|
|
66
|
-
element.identifierCombo = element.paramsCombo.selectionField !== element.ID ? element.paramsCombo.selectionField : element.ID;
|
|
67
|
-
this.dataCombo[element.identifierCombo] = res['body'];
|
|
68
|
-
if (this.data.action !== 'edit') {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
this.dataCombo[element.identifierCombo].some((data) => {
|
|
72
|
-
if (data[element.paramsCombo.selectionField] === element.value ||
|
|
73
|
-
data[element.paramsCombo.visibleField] === element.value) {
|
|
74
|
-
var value = data[element.paramsCombo.selectionField];
|
|
75
|
-
element.value = value;
|
|
76
|
-
group[element.ID].setValue(value);
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
return false;
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
onSubmit() {
|
|
85
|
-
if (this.modalForm.valid) {
|
|
86
|
-
this.data.columns.map((element) => {
|
|
87
|
-
if (element.paramsCombo && element.paramsCombo.returnDataSelect) {
|
|
88
|
-
element.identifierCombo = element.paramsCombo.selectionField !== element.ID ? element.paramsCombo.selectionField : element.ID;
|
|
89
|
-
let x = this.dataCombo[element.identifierCombo].find(x => x[element.identifierCombo] == this.modalForm.value[element.ID]);
|
|
90
|
-
if (x) {
|
|
91
|
-
this.modalForm.addControl(element.ID + 'Combo', new UntypedFormControl(x));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
this.dialogRef.close(this.modalForm.value);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
onChange(id, $event, type) {
|
|
99
|
-
switch (type) {
|
|
100
|
-
case 'combo':
|
|
101
|
-
this.modalForm.get(id).setValue($event.value);
|
|
102
|
-
break;
|
|
103
|
-
default:
|
|
104
|
-
this.modalForm.get(id).setValue($event.target.value);
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
TableModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableModalComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.UntypedFormBuilder }, { token: i3.HttpService }], target: i0.ɵɵFactoryTarget.Component });
|
|
110
|
-
TableModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableModalComponent, selector: "app-table-modal", ngImport: i0, template: "<div>\n <div style='display:flex; justify-content: space-between;'>\n <div>\n <strong>\n <h3 *ngIf='data.action==\"edit\"'> Editar </h3>\n <h3 *ngIf='data.action==\"add\"'> Agregar </h3>\n </strong>\n </div>\n <div mat-dialog-close>\n <i class=\"fa fa-times-circle\" style=\"font-size: 150%; position: relative;\"></i>\n </div>\n </div>\n\n <form [formGroup]=\"modalForm\">\n\n <div *ngFor='let input of data.columns'>\n\n\n\n <div *ngIf='data.action==\"edit\"; else Agregar'>\n <mat-form-field *ngIf=\"!input.disregardForEdit\">\n <div *ngIf='input.type==\"combo\"; else otherInputEdit'>\n\n <mat-select [value]=\"input.value\" (selectionChange)='onChange(input.ID,$event, input.type)'\n placeholder='{{input.label}}' [required]=\"input.required\">\n <mat-option *ngFor='let data of dataCombo[input.identifierCombo]'\n [value]='data[input.paramsCombo.selectionField]'>\n {{data[input.paramsCombo.visibleField]}}</mat-option>\n </mat-select>\n </div>\n\n <ng-template #otherInputEdit>\n <input [type]='input.type' [name]='input.ID' [value]='input.value'\n (input)='onChange(input.ID,$event, input.type)' matInput [placeholder]='input.label' [required]=\"input.required\" />\n </ng-template>\n\n <mat-error>Campo Obligatorio</mat-error>\n </mat-form-field>\n\n </div>\n\n <ng-template #Agregar>\n <mat-form-field *ngIf=\"!input.disregardForAdd\">\n <div *ngIf='input.type==\"combo\"; else otherInput'>\n\n <mat-select (selectionChange)='onChange(input.ID,$event, input.type)' placeholder='{{input.label}}' [required]=\"input.required\">\n <mat-option *ngFor='let data of dataCombo[input.identifierCombo]'\n [value]='data[input.paramsCombo.selectionField]'>\n {{data[input.paramsCombo.visibleField]}}</mat-option>\n </mat-select>\n\n </div>\n\n <ng-template #otherInput>\n <input [type]='input.type' [name]='input.ID' (input)='onChange(input.ID, $event, input.type)'\n matInput [placeholder]='input.label' [required]=\"input.required\" />\n\n </ng-template>\n <mat-error>Campo Obligatorio</mat-error>\n </mat-form-field>\n </ng-template>\n\n\n\n\n </div>\n\n <button *ngIf='data.action==\"add\" || data.action==\"edit\"'\n (click)='onSubmit()'\n color='primary'\n mat-raised-button\n [disabled]=\"!modalForm.valid\">Guardar</button>\n\n </form>\n</div>\n\n", styles: ["button{width:100%}mat-form-field{width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i6.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
|
|
111
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableModalComponent, decorators: [{
|
|
112
|
-
type: Component,
|
|
113
|
-
args: [{ selector: 'app-table-modal', template: "<div>\n <div style='display:flex; justify-content: space-between;'>\n <div>\n <strong>\n <h3 *ngIf='data.action==\"edit\"'> Editar </h3>\n <h3 *ngIf='data.action==\"add\"'> Agregar </h3>\n </strong>\n </div>\n <div mat-dialog-close>\n <i class=\"fa fa-times-circle\" style=\"font-size: 150%; position: relative;\"></i>\n </div>\n </div>\n\n <form [formGroup]=\"modalForm\">\n\n <div *ngFor='let input of data.columns'>\n\n\n\n <div *ngIf='data.action==\"edit\"; else Agregar'>\n <mat-form-field *ngIf=\"!input.disregardForEdit\">\n <div *ngIf='input.type==\"combo\"; else otherInputEdit'>\n\n <mat-select [value]=\"input.value\" (selectionChange)='onChange(input.ID,$event, input.type)'\n placeholder='{{input.label}}' [required]=\"input.required\">\n <mat-option *ngFor='let data of dataCombo[input.identifierCombo]'\n [value]='data[input.paramsCombo.selectionField]'>\n {{data[input.paramsCombo.visibleField]}}</mat-option>\n </mat-select>\n </div>\n\n <ng-template #otherInputEdit>\n <input [type]='input.type' [name]='input.ID' [value]='input.value'\n (input)='onChange(input.ID,$event, input.type)' matInput [placeholder]='input.label' [required]=\"input.required\" />\n </ng-template>\n\n <mat-error>Campo Obligatorio</mat-error>\n </mat-form-field>\n\n </div>\n\n <ng-template #Agregar>\n <mat-form-field *ngIf=\"!input.disregardForAdd\">\n <div *ngIf='input.type==\"combo\"; else otherInput'>\n\n <mat-select (selectionChange)='onChange(input.ID,$event, input.type)' placeholder='{{input.label}}' [required]=\"input.required\">\n <mat-option *ngFor='let data of dataCombo[input.identifierCombo]'\n [value]='data[input.paramsCombo.selectionField]'>\n {{data[input.paramsCombo.visibleField]}}</mat-option>\n </mat-select>\n\n </div>\n\n <ng-template #otherInput>\n <input [type]='input.type' [name]='input.ID' (input)='onChange(input.ID, $event, input.type)'\n matInput [placeholder]='input.label' [required]=\"input.required\" />\n\n </ng-template>\n <mat-error>Campo Obligatorio</mat-error>\n </mat-form-field>\n </ng-template>\n\n\n\n\n </div>\n\n <button *ngIf='data.action==\"add\" || data.action==\"edit\"'\n (click)='onSubmit()'\n color='primary'\n mat-raised-button\n [disabled]=\"!modalForm.valid\">Guardar</button>\n\n </form>\n</div>\n\n", styles: ["button{width:100%}mat-form-field{width:100%}\n"] }]
|
|
114
|
-
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
115
|
-
type: Inject,
|
|
116
|
-
args: [MAT_DIALOG_DATA]
|
|
117
|
-
}] }, { type: i2.UntypedFormBuilder }, { type: i3.HttpService }]; } });
|
|
1
|
+
import { Component, Inject } from '@angular/core';
|
|
2
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
+
import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms';
|
|
4
|
+
import { forkJoin } from 'rxjs';
|
|
5
|
+
import { map } from 'rxjs/operators';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/material/dialog";
|
|
8
|
+
import * as i2 from "@angular/forms";
|
|
9
|
+
import * as i3 from "../../../../services/http.service";
|
|
10
|
+
import * as i4 from "@angular/common";
|
|
11
|
+
import * as i5 from "@angular/material/button";
|
|
12
|
+
import * as i6 from "@angular/material/form-field";
|
|
13
|
+
import * as i7 from "@angular/material/input";
|
|
14
|
+
import * as i8 from "@angular/material/select";
|
|
15
|
+
import * as i9 from "@angular/material/core";
|
|
16
|
+
export class TableModalComponent {
|
|
17
|
+
constructor(dialogRef, data, formBuilder, http) {
|
|
18
|
+
this.dialogRef = dialogRef;
|
|
19
|
+
this.data = data;
|
|
20
|
+
this.formBuilder = formBuilder;
|
|
21
|
+
this.http = http;
|
|
22
|
+
this.modalForm = new UntypedFormGroup({});
|
|
23
|
+
this.dataCombo = {};
|
|
24
|
+
}
|
|
25
|
+
onNoClick() {
|
|
26
|
+
this.dialogRef.close();
|
|
27
|
+
}
|
|
28
|
+
ngOnInit() {
|
|
29
|
+
let group = {};
|
|
30
|
+
let httpRequests = [];
|
|
31
|
+
this.data.columns.map((element) => {
|
|
32
|
+
if (element.type === 'currency') {
|
|
33
|
+
element.value = element.value ? element.value.replace(/\./g, '') : '';
|
|
34
|
+
element.type = 'number';
|
|
35
|
+
}
|
|
36
|
+
if (!element.disregardForAdd) {
|
|
37
|
+
if (element.type === 'combo') {
|
|
38
|
+
this.dataCombo[element.paramsCombo.selectionField !== element.ID ? element.paramsCombo.selectionField : element.ID] = '';
|
|
39
|
+
}
|
|
40
|
+
let initialValue = this.data.action === 'edit' ? element.value : '';
|
|
41
|
+
if (element.type === 'date' && element.value) {
|
|
42
|
+
let s = element.value.split('/');
|
|
43
|
+
initialValue = `${s[2]}-${s[1]}-${s[0]}`;
|
|
44
|
+
}
|
|
45
|
+
group[element.ID] = element.required ? new UntypedFormControl(initialValue, Validators.required) : new UntypedFormControl(initialValue);
|
|
46
|
+
if (element.paramsCombo) {
|
|
47
|
+
httpRequests.push(this.createHttpRequest(element, group));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
if (httpRequests.length > 0) {
|
|
52
|
+
forkJoin(httpRequests).subscribe(() => {
|
|
53
|
+
this.modalForm = new UntypedFormGroup(group);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.modalForm = new UntypedFormGroup(group);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Extraemos la creación de la solicitud HTTP a su propia función para mejorar la legibilidad
|
|
61
|
+
createHttpRequest(element, group) {
|
|
62
|
+
return this.http
|
|
63
|
+
.getData(element.paramsCombo.url, element.paramsCombo.urlParams)
|
|
64
|
+
.pipe(map((res) => {
|
|
65
|
+
if (res['code'] === 0) {
|
|
66
|
+
element.identifierCombo = element.paramsCombo.selectionField !== element.ID ? element.paramsCombo.selectionField : element.ID;
|
|
67
|
+
this.dataCombo[element.identifierCombo] = res['body'];
|
|
68
|
+
if (this.data.action !== 'edit') {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this.dataCombo[element.identifierCombo].some((data) => {
|
|
72
|
+
if (data[element.paramsCombo.selectionField] === element.value ||
|
|
73
|
+
data[element.paramsCombo.visibleField] === element.value) {
|
|
74
|
+
var value = data[element.paramsCombo.selectionField];
|
|
75
|
+
element.value = value;
|
|
76
|
+
group[element.ID].setValue(value);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
onSubmit() {
|
|
85
|
+
if (this.modalForm.valid) {
|
|
86
|
+
this.data.columns.map((element) => {
|
|
87
|
+
if (element.paramsCombo && element.paramsCombo.returnDataSelect) {
|
|
88
|
+
element.identifierCombo = element.paramsCombo.selectionField !== element.ID ? element.paramsCombo.selectionField : element.ID;
|
|
89
|
+
let x = this.dataCombo[element.identifierCombo].find(x => x[element.identifierCombo] == this.modalForm.value[element.ID]);
|
|
90
|
+
if (x) {
|
|
91
|
+
this.modalForm.addControl(element.ID + 'Combo', new UntypedFormControl(x));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
this.dialogRef.close(this.modalForm.value);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
onChange(id, $event, type) {
|
|
99
|
+
switch (type) {
|
|
100
|
+
case 'combo':
|
|
101
|
+
this.modalForm.get(id).setValue($event.value);
|
|
102
|
+
break;
|
|
103
|
+
default:
|
|
104
|
+
this.modalForm.get(id).setValue($event.target.value);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
TableModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableModalComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.UntypedFormBuilder }, { token: i3.HttpService }], target: i0.ɵɵFactoryTarget.Component });
|
|
110
|
+
TableModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableModalComponent, selector: "app-table-modal", ngImport: i0, template: "<div>\n <div style='display:flex; justify-content: space-between;'>\n <div>\n <strong>\n <h3 *ngIf='data.action==\"edit\"'> Editar </h3>\n <h3 *ngIf='data.action==\"add\"'> Agregar </h3>\n </strong>\n </div>\n <div mat-dialog-close>\n <i class=\"fa fa-times-circle\" style=\"font-size: 150%; position: relative;\"></i>\n </div>\n </div>\n\n <form [formGroup]=\"modalForm\">\n\n <div *ngFor='let input of data.columns'>\n\n\n\n <div *ngIf='data.action==\"edit\"; else Agregar'>\n <mat-form-field *ngIf=\"!input.disregardForEdit\">\n <div *ngIf='input.type==\"combo\"; else otherInputEdit'>\n\n <mat-select [value]=\"input.value\" (selectionChange)='onChange(input.ID,$event, input.type)'\n placeholder='{{input.label}}' [required]=\"input.required\">\n <mat-option *ngFor='let data of dataCombo[input.identifierCombo]'\n [value]='data[input.paramsCombo.selectionField]'>\n {{data[input.paramsCombo.visibleField]}}</mat-option>\n </mat-select>\n </div>\n\n <ng-template #otherInputEdit>\n <input [type]='input.type' [name]='input.ID' [value]='input.value'\n (input)='onChange(input.ID,$event, input.type)' matInput [placeholder]='input.label' [required]=\"input.required\" />\n </ng-template>\n\n <mat-error>Campo Obligatorio</mat-error>\n </mat-form-field>\n\n </div>\n\n <ng-template #Agregar>\n <mat-form-field *ngIf=\"!input.disregardForAdd\">\n <div *ngIf='input.type==\"combo\"; else otherInput'>\n\n <mat-select (selectionChange)='onChange(input.ID,$event, input.type)' placeholder='{{input.label}}' [required]=\"input.required\">\n <mat-option *ngFor='let data of dataCombo[input.identifierCombo]'\n [value]='data[input.paramsCombo.selectionField]'>\n {{data[input.paramsCombo.visibleField]}}</mat-option>\n </mat-select>\n\n </div>\n\n <ng-template #otherInput>\n <input [type]='input.type' [name]='input.ID' (input)='onChange(input.ID, $event, input.type)'\n matInput [placeholder]='input.label' [required]=\"input.required\" />\n\n </ng-template>\n <mat-error>Campo Obligatorio</mat-error>\n </mat-form-field>\n </ng-template>\n\n\n\n\n </div>\n\n <button *ngIf='data.action==\"add\" || data.action==\"edit\"'\n (click)='onSubmit()'\n color='primary'\n mat-raised-button\n [disabled]=\"!modalForm.valid\">Guardar</button>\n\n </form>\n</div>\n\n", styles: ["button{width:100%}mat-form-field{width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i6.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
|
|
111
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableModalComponent, decorators: [{
|
|
112
|
+
type: Component,
|
|
113
|
+
args: [{ selector: 'app-table-modal', template: "<div>\n <div style='display:flex; justify-content: space-between;'>\n <div>\n <strong>\n <h3 *ngIf='data.action==\"edit\"'> Editar </h3>\n <h3 *ngIf='data.action==\"add\"'> Agregar </h3>\n </strong>\n </div>\n <div mat-dialog-close>\n <i class=\"fa fa-times-circle\" style=\"font-size: 150%; position: relative;\"></i>\n </div>\n </div>\n\n <form [formGroup]=\"modalForm\">\n\n <div *ngFor='let input of data.columns'>\n\n\n\n <div *ngIf='data.action==\"edit\"; else Agregar'>\n <mat-form-field *ngIf=\"!input.disregardForEdit\">\n <div *ngIf='input.type==\"combo\"; else otherInputEdit'>\n\n <mat-select [value]=\"input.value\" (selectionChange)='onChange(input.ID,$event, input.type)'\n placeholder='{{input.label}}' [required]=\"input.required\">\n <mat-option *ngFor='let data of dataCombo[input.identifierCombo]'\n [value]='data[input.paramsCombo.selectionField]'>\n {{data[input.paramsCombo.visibleField]}}</mat-option>\n </mat-select>\n </div>\n\n <ng-template #otherInputEdit>\n <input [type]='input.type' [name]='input.ID' [value]='input.value'\n (input)='onChange(input.ID,$event, input.type)' matInput [placeholder]='input.label' [required]=\"input.required\" />\n </ng-template>\n\n <mat-error>Campo Obligatorio</mat-error>\n </mat-form-field>\n\n </div>\n\n <ng-template #Agregar>\n <mat-form-field *ngIf=\"!input.disregardForAdd\">\n <div *ngIf='input.type==\"combo\"; else otherInput'>\n\n <mat-select (selectionChange)='onChange(input.ID,$event, input.type)' placeholder='{{input.label}}' [required]=\"input.required\">\n <mat-option *ngFor='let data of dataCombo[input.identifierCombo]'\n [value]='data[input.paramsCombo.selectionField]'>\n {{data[input.paramsCombo.visibleField]}}</mat-option>\n </mat-select>\n\n </div>\n\n <ng-template #otherInput>\n <input [type]='input.type' [name]='input.ID' (input)='onChange(input.ID, $event, input.type)'\n matInput [placeholder]='input.label' [required]=\"input.required\" />\n\n </ng-template>\n <mat-error>Campo Obligatorio</mat-error>\n </mat-form-field>\n </ng-template>\n\n\n\n\n </div>\n\n <button *ngIf='data.action==\"add\" || data.action==\"edit\"'\n (click)='onSubmit()'\n color='primary'\n mat-raised-button\n [disabled]=\"!modalForm.valid\">Guardar</button>\n\n </form>\n</div>\n\n", styles: ["button{width:100%}mat-form-field{width:100%}\n"] }]
|
|
114
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
115
|
+
type: Inject,
|
|
116
|
+
args: [MAT_DIALOG_DATA]
|
|
117
|
+
}] }, { type: i2.UntypedFormBuilder }, { type: i3.HttpService }]; } });
|
|
118
118
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2JyYWlubG9wZXItdWkvY29tcG9uZW50cy9kYXRhLXRhYmxlL3RhYmxlLW1vZGFsL3RhYmxlLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9icmFpbmxvcGVyLXVpL2NvbXBvbmVudHMvZGF0YS10YWJsZS90YWJsZS1tb2RhbC90YWJsZS1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBc0IsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7O0FBT3JDLE1BQU0sT0FBTyxtQkFBbUI7SUFLOUIsWUFDUyxTQUE0QyxFQUNuQixJQUFJLEVBQzVCLFdBQStCLEVBQy9CLElBQWlCO1FBSGxCLGNBQVMsR0FBVCxTQUFTLENBQW1DO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQUE7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLFNBQUksR0FBSixJQUFJLENBQWE7UUFSM0IsY0FBUyxHQUFxQixJQUFJLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELGNBQVMsR0FBRyxFQUFFLENBQUM7SUFRWixDQUFDO0lBRUosU0FBUztRQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxF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QUFDO2dCQUNyRCxNQUFNO1NBQ1Q7SUFDSCxDQUFDOztnSEFuSFUsbUJBQW1CLDhDQU9wQixlQUFlO29HQVBkLG1CQUFtQix1RENaaEMsb2tHQTRFQTsyRkRoRWEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjs7MEJBV3hCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSHR0cFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXRhYmxlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIG1vZGFsRm9ybTogVW50eXBlZEZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcbiAgZGF0YUNvbWJvID0ge307XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VGFibGVNb2RhbENvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBTZXJ2aWNlXG4gICkge31cblxuICBvbk5vQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGxldCBncm91cCA9IHt9O1xuICAgIGxldCBodHRwUmVxdWVzdHMgPSBbXTtcblxuICAgIHRoaXMuZGF0YS5jb2x1bW5zLm1hcCgoZWxlbWVudCkgPT4ge1xuXG4gICAgICBpZihlbGVtZW50LnR5cGUgPT09ICdjdXJyZW5jeScpIHtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IGVsZW1lbnQudmFsdWUgPyBlbGVtZW50LnZhbHVlLnJlcGxhY2UoL1xcLi9nLCAnJykgOiAnJztcbiAgICAgICAgZWxlbWVudC50eXBlID0gJ251bWJlcidcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50LmRpc3JlZ2FyZEZvckFkZCkge1xuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY29tYm8nKSB7XG4gICAgICAgICAgdGhpcy5kYXRhQ29tYm9bZWxlbWVudC5wYXJhbXNDb21iby5zZWxlY3Rpb25GaWVsZCAhPT0gZWxlbWVudC5JRCA/IGVsZW1lbnQucGFyYW1zQ29tYm8uc2VsZWN0aW9uRmllbGQgOiBlbGVtZW50LklEXSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGluaXRpYWxWYWx1ZSA9IHRoaXMuZGF0YS5hY3Rpb24gPT09ICdlZGl0JyA/IGVsZW1lbnQudmFsdWUgOiAnJztcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2RhdGUnICYmIGVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICBsZXQgcyA9IGVsZW1lbnQudmFsdWUuc3BsaXQoJy8nKTtcbiAgICAgICAgICBpbml0aWFsVmFsdWUgPSBgJHtzWzJdfS0ke3NbMV19LSR7c1swXX1gO1xuICAgICAgICB9XG5cblxuICAgICAgICBncm91cFtlbGVtZW50LklEXSA9IGVsZW1lbnQucmVxdWlyZWQgPyBuZXcgVW50eXBlZEZvcm1Db250cm9sKGluaXRpYWxWYWx1ZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCkgOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGluaXRpYWxWYWx1ZSk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQucGFyYW1zQ29tYm8pIHtcbiAgICAgICAgICBodHRwUmVxdWVzdHMucHVzaCh0aGlzLmNyZWF0ZUh0dHBSZXF1ZXN0KGVsZW1lbnQsIGdyb3VwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChodHRwUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9ya0pvaW4oaHR0cFJlcXVlc3RzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLm1vZGFsRm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGFsRm9ybSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICAvLyBFeHRyYWVtb3MgbGEgY3JlYWNpw7NuIGRlIGxhIHNvbGljaXR1ZCBIVFRQIGEgc3UgcHJvcGlhIGZ1bmNpw7NuIHBhcmEgbWVqb3JhciBsYSBsZWdpYmlsaWRhZFxuICBjcmVhdGVIdHRwUmVxdWVzdChlbGVtZW50LCBncm91cCkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXREYXRhKGVsZW1lbnQucGFyYW1zQ29tYm8udXJsLCBlbGVtZW50LnBhcmFtc0NvbWJvLnVybFBhcmFtcylcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXNbJ2NvZGUnXSA9PT0gMCkge1xuICAgICAgICAgICAgZWxlbWVudC5pZGVudGlmaWVyQ29tYm8gPSBlbGVtZW50LnBhcmFtc0NvbWJvLnNlbGVjdGlvbkZpZWxkICE9PSBlbGVtZW50LklEID8gZWxlbWVudC5wYXJhbXNDb21iby5zZWxlY3Rpb25GaWVsZCA6IGVsZW1lbnQuSUQ7XG4gICAgICAgICAgICB0aGlzLmRhdGFDb21ib1tlbGVtZW50LmlkZW50aWZpZXJDb21ib10gPSByZXNbJ2JvZHknXTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5hY3Rpb24gIT09ICdlZGl0Jykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGF0YUNvbWJvW2VsZW1lbnQuaWRlbnRpZmllckNvbWJvXS5zb21lKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBkYXRhW2VsZW1lbnQucGFyYW1zQ29tYm8uc2VsZWN0aW9uRmllbGRdID09PSBlbGVtZW50LnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgZGF0YVtlbGVtZW50LnBhcmFtc0NvbWJvLnZpc2libGVGaWVsZF0gPT09IGVsZW1lbnQudmFsdWVcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZGF0YVtlbGVtZW50LnBhcmFtc0NvbWJvLnNlbGVjdGlvbkZpZWxkXVxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIGdyb3VwW2VsZW1lbnQuSURdLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuXG4gIG9uU3VibWl0KCkge1xuICAgIGlmICh0aGlzLm1vZGFsRm9ybS52YWxpZCkge1xuXG4gICAgICB0aGlzLmRhdGEuY29sdW1ucy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyYW1zQ29tYm8gJiYgZWxlbWVudC5wYXJhbXNDb21iby5yZXR1cm5EYXRhU2VsZWN0KSB7XG4gICAgICAgICAgZWxlbWVudC5pZGVudGlmaWVyQ29tYm8gPSBlbGVtZW50LnBhcmFtc0NvbWJvLnNlbGVjdGlvbkZpZWxkICE9PSBlbGVtZW50LklEID8gZWxlbWVudC5wYXJhbXNDb21iby5zZWxlY3Rpb25GaWVsZCA6IGVsZW1lbnQuSUQ7XG4gICAgICAgICAgbGV0IHggPSB0aGlzLmRhdGFDb21ib1tlbGVtZW50LmlkZW50aWZpZXJDb21ib10uZmluZCh4ID0+IHhbZWxlbWVudC5pZGVudGlmaWVyQ29tYm9dID09IHRoaXMubW9kYWxGb3JtLnZhbHVlW2VsZW1lbnQuSURdKVxuICAgICAgICAgIGlmKHgpe1xuICAgICAgICAgICAgdGhpcy5tb2RhbEZvcm0uYWRkQ29udHJvbChlbGVtZW50LklEICsgJ0NvbWJvJywgbmV3IFVudHlwZWRGb3JtQ29udHJvbCh4KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0aGlzLm1vZGFsRm9ybS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UoaWQ6IGFueSwgJGV2ZW50LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbWJvJzpcbiAgICAgICAgdGhpcy5tb2RhbEZvcm0uZ2V0KGlkKS5zZXRWYWx1ZSgkZXZlbnQudmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5tb2RhbEZvcm0uZ2V0KGlkKS5zZXRWYWx1ZSgkZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2PlxuICAgIDxkaXYgc3R5bGU9J2Rpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyc+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgIDxoMyAqbmdJZj0nZGF0YS5hY3Rpb249PVwiZWRpdFwiJz4gRWRpdGFyIDwvaDM+XG4gICAgICAgICAgICAgICAgPGgzICpuZ0lmPSdkYXRhLmFjdGlvbj09XCJhZGRcIic+IEFncmVnYXIgPC9oMz5cbiAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBtYXQtZGlhbG9nLWNsb3NlPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lcy1jaXJjbGVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTUwJTsgcG9zaXRpb246IHJlbGF0aXZlO1wiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIm1vZGFsRm9ybVwiPlxuXG4gICAgICAgIDxkaXYgKm5nRm9yPSdsZXQgaW5wdXQgb2YgZGF0YS5jb2x1bW5zJz5cblxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPSdkYXRhLmFjdGlvbj09XCJlZGl0XCI7IGVsc2UgQWdyZWdhcic+XG4gICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhaW5wdXQuZGlzcmVnYXJkRm9yRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPSdpbnB1dC50eXBlPT1cImNvbWJvXCI7IGVsc2Ugb3RoZXJJbnB1dEVkaXQnPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiaW5wdXQudmFsdWVcIiAoc2VsZWN0aW9uQ2hhbmdlKT0nb25DaGFuZ2UoaW5wdXQuSUQsJGV2ZW50LCBpbnB1dC50eXBlKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0ne3tpbnB1dC5sYWJlbH19JyBbcmVxdWlyZWRdPVwiaW5wdXQucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9J2xldCBkYXRhIG9mIGRhdGFDb21ib1tpbnB1dC5pZGVudGlmaWVyQ29tYm9dJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPSdkYXRhW2lucHV0LnBhcmFtc0NvbWJvLnNlbGVjdGlvbkZpZWxkXSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGF0YVtpbnB1dC5wYXJhbXNDb21iby52aXNpYmxlRmllbGRdfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3RoZXJJbnB1dEVkaXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW3R5cGVdPSdpbnB1dC50eXBlJyBbbmFtZV09J2lucHV0LklEJyBbdmFsdWVdPSdpbnB1dC52YWx1ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPSdvbkNoYW5nZShpbnB1dC5JRCwkZXZlbnQsIGlucHV0LnR5cGUpJyBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPSdpbnB1dC5sYWJlbCcgW3JlcXVpcmVkXT1cImlucHV0LnJlcXVpcmVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yPkNhbXBvIE9ibGlnYXRvcmlvPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI0FncmVnYXI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhaW5wdXQuZGlzcmVnYXJkRm9yQWRkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9J2lucHV0LnR5cGU9PVwiY29tYm9cIjsgZWxzZSBvdGhlcklucHV0Jz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgKHNlbGVjdGlvbkNoYW5nZSk9J29uQ2hhbmdlKGlucHV0LklELCRldmVudCwgaW5wdXQudHlwZSknIHBsYWNlaG9sZGVyPSd7e2lucHV0LmxhYmVsfX0nIFtyZXF1aXJlZF09XCJpbnB1dC5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj0nbGV0IGRhdGEgb2YgZGF0YUNvbWJvW2lucHV0LmlkZW50aWZpZXJDb21ib10nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09J2RhdGFbaW5wdXQucGFyYW1zQ29tYm8uc2VsZWN0aW9uRmllbGRdJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhW2lucHV0LnBhcmFtc0NvbWJvLnZpc2libGVGaWVsZF19fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI290aGVySW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW3R5cGVdPSdpbnB1dC50eXBlJyBbbmFtZV09J2lucHV0LklEJyAoaW5wdXQpPSdvbkNoYW5nZShpbnB1dC5JRCwgJGV2ZW50LCBpbnB1dC50eXBlKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPSdpbnB1dC5sYWJlbCcgW3JlcXVpcmVkXT1cImlucHV0LnJlcXVpcmVkXCIgIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvcj5DYW1wbyBPYmxpZ2F0b3JpbzwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG5cblxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gKm5nSWY9J2RhdGEuYWN0aW9uPT1cImFkZFwiIHx8IGRhdGEuYWN0aW9uPT1cImVkaXRcIidcbiAgICAgICAgICAgIChjbGljayk9J29uU3VibWl0KCknXG4gICAgICAgICAgICBjb2xvcj0ncHJpbWFyeSdcbiAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1vZGFsRm9ybS52YWxpZFwiPkd1YXJkYXI8L2J1dHRvbj5cblxuICAgIDwvZm9ybT5cbjwvZGl2PlxuXG4iXX0=
|