brainloper-ui 14.1.0 → 14.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/esm2020/brainloper-ui.mjs +4 -4
  2. package/esm2020/public_api.mjs +56 -51
  3. package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +310 -305
  4. package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +29 -29
  5. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +23 -23
  6. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +83 -83
  7. package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +37 -31
  8. package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +176 -176
  9. package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +728 -652
  10. package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +118 -118
  11. package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +186 -185
  12. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.mjs +1 -1
  13. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.mjs +1 -1
  14. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.mjs +1 -1
  15. package/esm2020/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +222 -222
  16. package/esm2020/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.mjs +80 -80
  17. package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +81 -81
  18. package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +108 -108
  19. package/esm2020/src/app/modules/directives/carousel-item.directive.mjs +18 -0
  20. package/esm2020/src/app/modules/interfaces/buttons/button-icon.mjs +2 -2
  21. package/esm2020/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +2 -2
  22. package/esm2020/src/app/modules/interfaces/combos/combos-configuration.mjs +2 -2
  23. package/esm2020/src/app/modules/interfaces/data-table/params.mjs +2 -2
  24. package/esm2020/src/app/modules/interfaces/data-table/rules.mjs +2 -2
  25. package/esm2020/src/app/modules/interfaces/data-table/table-columns.mjs +2 -2
  26. package/esm2020/src/app/modules/interfaces/data-table/table-configuration.mjs +2 -2
  27. package/esm2020/src/app/modules/interfaces/enum/enumActions.mjs +8 -7
  28. package/esm2020/src/app/modules/interfaces/enum/enumRules.mjs +8 -8
  29. package/esm2020/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +2 -2
  30. package/esm2020/src/app/modules/interfaces/file-forms-service/file-input-params.mjs +2 -2
  31. package/esm2020/src/app/modules/interfaces/filters/header-filters.mjs +2 -2
  32. package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +8 -8
  33. package/esm2020/src/app/modules/interfaces/report/template-pdf-ot.mjs +2 -2
  34. package/esm2020/src/app/modules/interfaces/report/template-pfd-fo.mjs +2 -2
  35. package/esm2020/src/app/modules/services/crypto.service.mjs +37 -37
  36. package/esm2020/src/app/modules/services/export-data.service.mjs +166 -166
  37. package/esm2020/src/app/modules/services/file-forms.service.mjs +24 -24
  38. package/esm2020/src/app/modules/services/functions.service.mjs +54 -54
  39. package/esm2020/src/app/modules/services/generate-pdf.service.mjs +58 -58
  40. package/esm2020/src/app/modules/services/http.service.mjs +97 -154
  41. package/esm2020/src/app/modules/services/loading/loading.component.mjs +28 -28
  42. package/esm2020/src/app/modules/services/local-storage.service.mjs +115 -115
  43. package/esm2020/src/app/modules/services/message.service.mjs +200 -200
  44. package/esm2020/src/app/modules/services/screen-size-util.mjs +6 -6
  45. package/esm2020/src/app/modules/services/session.service.mjs +42 -42
  46. package/fesm2015/brainloper-ui.mjs +2819 -2769
  47. package/fesm2015/brainloper-ui.mjs.map +1 -1
  48. package/fesm2020/brainloper-ui.mjs +2779 -2733
  49. package/fesm2020/brainloper-ui.mjs.map +1 -1
  50. package/index.d.ts +5 -5
  51. package/package.json +3 -1
  52. package/public_api.d.ts +55 -50
  53. package/src/app/modules/brainloper-ui/brainloper-ui.module.d.ts +62 -73
  54. package/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.d.ts +13 -13
  55. package/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.d.ts +10 -10
  56. package/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.d.ts +24 -24
  57. package/src/app/modules/brainloper-ui/components/carousel/carousel.component.d.ts +15 -12
  58. package/src/app/modules/brainloper-ui/components/combos/combos.component.d.ts +46 -46
  59. package/src/app/modules/brainloper-ui/components/data-table/data-table.component.d.ts +125 -119
  60. package/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.d.ts +21 -21
  61. package/src/app/modules/brainloper-ui/components/file-input/file-input.component.d.ts +42 -42
  62. package/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.d.ts +2 -2
  63. package/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.d.ts +2 -2
  64. package/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.d.ts +2 -2
  65. package/src/app/modules/brainloper-ui/components/filters/filters.component.d.ts +30 -30
  66. package/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.d.ts +35 -35
  67. package/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.d.ts +36 -36
  68. package/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.d.ts +26 -26
  69. package/src/app/modules/directives/carousel-item.directive.d.ts +9 -0
  70. package/src/app/modules/interfaces/buttons/button-icon.d.ts +9 -9
  71. package/src/app/modules/interfaces/buttons/button-lavel-edit.d.ts +6 -6
  72. package/src/app/modules/interfaces/combos/combos-configuration.d.ts +13 -13
  73. package/src/app/modules/interfaces/data-table/params.d.ts +7 -7
  74. package/src/app/modules/interfaces/data-table/rules.d.ts +8 -8
  75. package/src/app/modules/interfaces/data-table/table-columns.d.ts +25 -25
  76. package/src/app/modules/interfaces/data-table/table-configuration.d.ts +26 -25
  77. package/src/app/modules/interfaces/enum/enumActions.d.ts +6 -5
  78. package/src/app/modules/interfaces/enum/enumRules.d.ts +6 -6
  79. package/src/app/modules/interfaces/file-forms-service/file-forms-params.d.ts +4 -4
  80. package/src/app/modules/interfaces/file-forms-service/file-input-params.d.ts +13 -13
  81. package/src/app/modules/interfaces/filters/header-filters.d.ts +13 -13
  82. package/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.d.ts +10 -10
  83. package/src/app/modules/interfaces/report/template-pdf-ot.d.ts +19 -19
  84. package/src/app/modules/interfaces/report/template-pfd-fo.d.ts +20 -20
  85. package/src/app/modules/services/crypto.service.d.ts +10 -10
  86. package/src/app/modules/services/export-data.service.d.ts +18 -18
  87. package/src/app/modules/services/file-forms.service.d.ts +7 -7
  88. package/src/app/modules/services/functions.service.d.ts +13 -13
  89. package/src/app/modules/services/generate-pdf.service.d.ts +12 -12
  90. package/src/app/modules/services/http.service.d.ts +22 -21
  91. package/src/app/modules/services/loading/loading.component.d.ts +15 -15
  92. package/src/app/modules/services/local-storage.service.d.ts +49 -49
  93. package/src/app/modules/services/message.service.d.ts +23 -23
  94. package/src/app/modules/services/screen-size-util.d.ts +3 -3
  95. package/src/app/modules/services/session.service.d.ts +14 -14
@@ -1,222 +1,222 @@
1
- import { ScreenSizeUtil } from '../../../services/screen-size-util';
2
- import { Component, EventEmitter, Input, Output } from '@angular/core';
3
- import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../../services/functions.service";
6
- import * as i2 from "../../../services/http.service";
7
- import * as i3 from "@angular/common";
8
- import * as i4 from "@angular/material/icon";
9
- import * as i5 from "@angular/material/form-field";
10
- import * as i6 from "@angular/material/input";
11
- import * as i7 from "@angular/material/select";
12
- import * as i8 from "@angular/material/core";
13
- import * as i9 from "@angular/material/datepicker";
14
- import * as i10 from "@angular/forms";
15
- import * as i11 from "../select-filter/select-filter.component";
16
- export class FiltersComponent {
17
- constructor(functionEter, http) {
18
- this.functionEter = functionEter;
19
- this.http = http;
20
- this.headerFilters = [];
21
- this.applyFilters = new EventEmitter();
22
- this.headerFiltersValue = "-1";
23
- this.headerFiltersSelected = [];
24
- this.movil = ScreenSizeUtil.isMobile();
25
- this.filtersPost = [];
26
- this.loadDates();
27
- this.loadDatesBetween();
28
- }
29
- async ngOnChanges(changes) {
30
- if (changes) {
31
- await this.loadFilter();
32
- }
33
- }
34
- async ngOnInit() {
35
- // if(this.headerFilters && this.headerFilters.length > 0)
36
- // await this.loadFilter()
37
- }
38
- handlerFiltersDate(deleteFilter, item, valueDate = null, valueBetween1 = null, valueBetween2 = null) {
39
- switch (item.type) {
40
- case 'date':
41
- if (deleteFilter) {
42
- this.delteFilter({
43
- labelFilter: 'Fecha entre',
44
- type: 'dateRange'
45
- });
46
- }
47
- else {
48
- this.loadDates(new Date(valueDate + "T05:00:00.000Z"));
49
- }
50
- break;
51
- case 'dateRange':
52
- if (deleteFilter) {
53
- this.delteFilter({
54
- labelFilter: 'Fecha igual a',
55
- type: 'date'
56
- });
57
- }
58
- else {
59
- this.loadDatesBetween(false, new Date(valueBetween1 + "T05:00:00.000Z"), new Date(valueBetween2 + "T05:00:00.000Z"));
60
- }
61
- break;
62
- default:
63
- break;
64
- }
65
- }
66
- selectFilter($event) {
67
- let validate = this.headerFiltersSelected.find(x => x.labelFilter == $event.value);
68
- if (!validate) {
69
- let value = this.headerFilters.find(x => x.labelFilter == $event.value);
70
- if (value) {
71
- this.headerFiltersSelected.push(value);
72
- this.handlerFiltersDate(true, { type: value.type });
73
- }
74
- }
75
- setTimeout(() => {
76
- this.headerFiltersValue = null;
77
- }, 500);
78
- }
79
- async selectFilterData($event, item) {
80
- let i = this.headerFiltersSelected.findIndex(x => x.labelFilter == item.labelFilter);
81
- if (i >= 0)
82
- this.headerFiltersSelected[i].value = $event.value;
83
- let f = this.filtersPost.findIndex(x => x.labelFilter == item.labelFilter);
84
- if ($event.value) {
85
- let value = null;
86
- switch (item.type) {
87
- case 'select':
88
- value = $event.value;
89
- break;
90
- case 'date':
91
- value = this.functionEter.dateDB($event.value);
92
- break;
93
- case 'dateRange':
94
- value = `${this.functionEter.dateDB(this.campaignOne.controls.start.value)},${this.functionEter.dateDB(this.campaignOne.controls.end.value)}`;
95
- break;
96
- default:
97
- break;
98
- }
99
- if (!value)
100
- return;
101
- if (f >= 0) {
102
- this.filtersPost[f].value = value;
103
- }
104
- else {
105
- this.filtersPost.push({
106
- tN: btoa(item.tN),
107
- primaryKey: item.fileNameDb ? item.fileNameDb : item.primaryKey,
108
- type: item.type,
109
- value: value,
110
- labelFilter: item.labelFilter
111
- });
112
- }
113
- this.applyFilters.emit(this.filtersPost);
114
- }
115
- }
116
- delteFilter(item) {
117
- let i = this.headerFiltersSelected.findIndex(x => x.labelFilter == item.labelFilter);
118
- let f = this.filtersPost.findIndex(x => x.labelFilter == item.labelFilter);
119
- if (i >= 0) {
120
- this.headerFiltersSelected[i].value = "-1";
121
- this.headerFiltersSelected.splice(i, 1);
122
- }
123
- if (f >= 0) {
124
- this.filtersPost.splice(f, 1);
125
- this.applyFilters.emit(this.filtersPost);
126
- }
127
- this.handlerFiltersDate(false, item);
128
- setTimeout(() => {
129
- this.headerFiltersValue = null;
130
- }, 500);
131
- }
132
- loadDates(value = null) {
133
- this.fecha = new UntypedFormGroup({
134
- fecha: new UntypedFormControl(value)
135
- });
136
- }
137
- loadDatesBetween(init = true, value1 = null, value2 = null) {
138
- if (init) {
139
- this.campaignOne = new UntypedFormGroup({
140
- start: new UntypedFormControl(null),
141
- end: new UntypedFormControl(null),
142
- });
143
- this.campaignTwo = new UntypedFormGroup({
144
- start: new UntypedFormControl(null),
145
- end: new UntypedFormControl(null),
146
- });
147
- return;
148
- }
149
- var day1 = 1;
150
- var day2 = 15;
151
- if (!value1) {
152
- value1 = new Date();
153
- }
154
- else {
155
- day1 = value1.getDate();
156
- }
157
- if (!value2) {
158
- value2 = new Date();
159
- }
160
- else {
161
- day2 = value2.getDate();
162
- }
163
- this.campaignOne = new UntypedFormGroup({
164
- start: new UntypedFormControl(new Date(value1.getFullYear(), value1.getMonth(), day1)),
165
- end: new UntypedFormControl(new Date(value2.getFullYear(), value2.getMonth(), day2)),
166
- });
167
- this.campaignTwo = new UntypedFormGroup({
168
- start: new UntypedFormControl(new Date(value1.getFullYear(), value1.getMonth(), day1)),
169
- end: new UntypedFormControl(new Date(value1.getFullYear(), value1.getMonth(), day1)),
170
- });
171
- }
172
- async loadFilter() {
173
- // if (this.headerFiltersSelected.length != 0) {
174
- // return
175
- // }
176
- let applyFilter = false;
177
- for (let element of this.headerFilters) {
178
- if (element.urlData) {
179
- let res = await this.http.getDataBody(element.urlData);
180
- element.body = res;
181
- }
182
- else if (element.type == 'select') {
183
- element.body = element.data;
184
- }
185
- element.filteredList = element.body;
186
- if (!element.primaryKey)
187
- element.primaryKey = element.visibleField;
188
- if (element.type == "date")
189
- element.labelFilter = element.labelFilter ?? "Fecha igual a";
190
- if (element.type == "dateRange")
191
- element.labelFilter = element.labelFilter ?? "Fecha entre";
192
- if (element.active) {
193
- this.headerFiltersSelected.push(element);
194
- this.filtersPost.push({
195
- tN: btoa(element.tN),
196
- primaryKey: element.fileNameDb ? element.fileNameDb : element.primaryKey,
197
- type: element.type,
198
- value: element.value,
199
- labelFilter: element.labelFilter
200
- });
201
- this.handlerFiltersDate(false, element, element.value, element.value.split(',')[0], element.value.split(',')[1]);
202
- if (element.value && element.value != '') {
203
- applyFilter = true;
204
- }
205
- }
206
- }
207
- if (applyFilter) {
208
- this.applyFilters.emit(this.filtersPost);
209
- }
210
- }
211
- }
212
- FiltersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FiltersComponent, deps: [{ token: i1.FunctionsService }, { token: i2.HttpService }], target: i0.ɵɵFactoryTarget.Component });
213
- FiltersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FiltersComponent, selector: "app-filters", inputs: { headerFilters: "headerFilters" }, outputs: { applyFilters: "applyFilters" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"headerFilters && headerFilters.length > 0\" style=\"display: flex; width: 100%; flex-wrap: wrap;\" class=\"col-12 mb-2\">\r\n <div class=\"col-md-4 col-12\">\r\n <mat-form-field >\r\n <mat-label>Filtros</mat-label>\r\n <mat-select (selectionChange)=\"selectFilter($event)\" [(ngModel)]=\"headerFiltersValue\">\r\n <mat-option\r\n *ngFor=\"let f of headerFilters\"\r\n value=\"{{ f.labelFilter }}\"\r\n >\r\n {{ f.labelFilter }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngFor=\"let item of headerFiltersSelected\" class=\"col-md-4 col-12 d-flex align-items-center\">\r\n <mat-form-field *ngIf=\"item.type == 'select'\">\r\n <mat-label>Filtrar por {{item.labelFilter}}</mat-label>\r\n <mat-select (selectionChange)=\"selectFilterData($event, item)\" [value]=\"item.value\">\r\n <app-select-filter\r\n [placeholder]=\"'Filter'\"\r\n [displayMember]=\"item.visibleField\"\r\n [array]=\"item.body\"\r\n (filteredReturn)=\"item.filteredList = $event\"\r\n [noResultsMessage]=\"'No hay resultados'\"\r\n >\r\n </app-select-filter>\r\n <mat-option\r\n *ngFor=\"let data of item.filteredList\"\r\n value=\"{{ data[item.primaryKey] }}\"\r\n >\r\n {{ data[item.visibleField] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"item.type == 'date'\" [formGroup]=\"fecha\">\r\n <mat-label>{{item.labelFilter}}</mat-label>\r\n <input (dateInput)=\"selectFilterData($event, item)\" matInput [matDatepicker]=\"Fecha\" autocomplete=\"off\" matInput\r\n formControlName='fecha' required>\r\n <mat-datepicker-toggle matSuffix [for]=\"Fecha\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker dateInput #Fecha [touchUi]='movil?true:false'></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"item.type == 'dateRange'\">\r\n <mat-label>{{item.labelFilter}}</mat-label>\r\n <mat-date-range-input\r\n [formGroup]=\"campaignOne\"\r\n [rangePicker]=\"campaignOnePicker\"\r\n [comparisonStart]=\"campaignTwo.value.start\"\r\n [comparisonEnd]=\"campaignTwo.value.end\">\r\n <input matStartDate placeholder=\"Start date\" formControlName=\"start\">\r\n <input (dateInput)=\"selectFilterData($event, item)\" matEndDate placeholder=\"End date\" formControlName=\"end\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matSuffix [for]=\"campaignOnePicker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #campaignOnePicker></mat-date-range-picker>\r\n </mat-form-field>\r\n\r\n <div class=\"p-2\" style=\"cursor: pointer\" (click)=\"delteFilter(item)\"><mat-icon>cancel</mat-icon></div>\r\n\r\n </div>\r\n</div>\r\n", styles: ["mat-form-field{padding:0!important;width:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i6.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: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i9.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i9.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i9.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i9.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i9.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.SelectFilterComponent, selector: "app-select-filter", inputs: ["array", "placeholder", "color", "displayMember", "showSpinner", "noResultsMessage", "hasGroup", "groupArrayName"], outputs: ["filteredReturn"] }] });
214
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FiltersComponent, decorators: [{
215
- type: Component,
216
- args: [{ selector: 'app-filters', template: "<div *ngIf=\"headerFilters && headerFilters.length > 0\" style=\"display: flex; width: 100%; flex-wrap: wrap;\" class=\"col-12 mb-2\">\r\n <div class=\"col-md-4 col-12\">\r\n <mat-form-field >\r\n <mat-label>Filtros</mat-label>\r\n <mat-select (selectionChange)=\"selectFilter($event)\" [(ngModel)]=\"headerFiltersValue\">\r\n <mat-option\r\n *ngFor=\"let f of headerFilters\"\r\n value=\"{{ f.labelFilter }}\"\r\n >\r\n {{ f.labelFilter }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngFor=\"let item of headerFiltersSelected\" class=\"col-md-4 col-12 d-flex align-items-center\">\r\n <mat-form-field *ngIf=\"item.type == 'select'\">\r\n <mat-label>Filtrar por {{item.labelFilter}}</mat-label>\r\n <mat-select (selectionChange)=\"selectFilterData($event, item)\" [value]=\"item.value\">\r\n <app-select-filter\r\n [placeholder]=\"'Filter'\"\r\n [displayMember]=\"item.visibleField\"\r\n [array]=\"item.body\"\r\n (filteredReturn)=\"item.filteredList = $event\"\r\n [noResultsMessage]=\"'No hay resultados'\"\r\n >\r\n </app-select-filter>\r\n <mat-option\r\n *ngFor=\"let data of item.filteredList\"\r\n value=\"{{ data[item.primaryKey] }}\"\r\n >\r\n {{ data[item.visibleField] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"item.type == 'date'\" [formGroup]=\"fecha\">\r\n <mat-label>{{item.labelFilter}}</mat-label>\r\n <input (dateInput)=\"selectFilterData($event, item)\" matInput [matDatepicker]=\"Fecha\" autocomplete=\"off\" matInput\r\n formControlName='fecha' required>\r\n <mat-datepicker-toggle matSuffix [for]=\"Fecha\">\r\n </mat-datepicker-toggle>\r\n <mat-datepicker dateInput #Fecha [touchUi]='movil?true:false'></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"item.type == 'dateRange'\">\r\n <mat-label>{{item.labelFilter}}</mat-label>\r\n <mat-date-range-input\r\n [formGroup]=\"campaignOne\"\r\n [rangePicker]=\"campaignOnePicker\"\r\n [comparisonStart]=\"campaignTwo.value.start\"\r\n [comparisonEnd]=\"campaignTwo.value.end\">\r\n <input matStartDate placeholder=\"Start date\" formControlName=\"start\">\r\n <input (dateInput)=\"selectFilterData($event, item)\" matEndDate placeholder=\"End date\" formControlName=\"end\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matSuffix [for]=\"campaignOnePicker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #campaignOnePicker></mat-date-range-picker>\r\n </mat-form-field>\r\n\r\n <div class=\"p-2\" style=\"cursor: pointer\" (click)=\"delteFilter(item)\"><mat-icon>cancel</mat-icon></div>\r\n\r\n </div>\r\n</div>\r\n", styles: ["mat-form-field{padding:0!important;width:100%}\n"] }]
217
- }], ctorParameters: function () { return [{ type: i1.FunctionsService }, { type: i2.HttpService }]; }, propDecorators: { headerFilters: [{
218
- type: Input
219
- }], applyFilters: [{
220
- type: Output
221
- }] } });
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBVyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBU3RFLE1BQU0sT0FBTyxnQkFBZ0I7SUFlM0IsWUFDVSxZQUE4QixFQUM5QixJQUFpQjtRQURqQixpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFDOUIsU0FBSSxHQUFKLElBQUksQ0FBYTtRQWZsQixrQkFBYSxHQUFlLEVBQUUsQ0FBQTtRQUM3QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFakQsdUJBQWtCLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLDBCQUFxQixHQUFnQixFQUFFLENBQUE7UUFJdkMsVUFBSyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUdsQyxnQkFBVyxHQUFHLEVBQUUsQ0FBQTtRQU1kLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBQ0YsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFzQjtRQUN0QyxJQUFLLE9BQU8sRUFBRTtZQUNaLE1B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MkZEbERhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxhQUFhO2lJQU1kLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHR0cC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRnVuY3Rpb25zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Z1bmN0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2NyZWVuU2l6ZVV0aWwgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zY3JlZW4tc2l6ZS11dGlsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBEb0NoZWNrLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZWxlbWVudCB9IGZyb20gJ3Byb3RyYWN0b3InO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWZpbHRlcnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9maWx0ZXJzLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbHRlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIGhlYWRlckZpbHRlcnM6IEFycmF5PGFueT4gPSBbXVxyXG4gIEBPdXRwdXQoKSBhcHBseUZpbHRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgaGVhZGVyRmlsdGVyc1ZhbHVlID0gXCItMVwiXHJcbiAgaGVhZGVyRmlsdGVyc1NlbGVjdGVkIDogQXJyYXk8YW55PiA9IFtdXHJcbiAgY2FtcGFpZ25PbmU6IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgY2FtcGFpZ25Ud286IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgZmVjaGE6IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgbW92aWwgPSBTY3JlZW5TaXplVXRpbC5pc01vYmlsZSgpO1xyXG5cclxuXHJcbiAgZmlsdGVyc1Bvc3QgPSBbXVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZnVuY3Rpb25FdGVyOiBGdW5jdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwU2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMubG9hZERhdGVzKClcclxuICAgIHRoaXMubG9hZERhdGVzQmV0d2VlbigpXHJcbiAgIH1cclxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoIGNoYW5nZXMpIHtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsdGVyKClcclxuICAgIH1cclxuICB9ICBcclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBpZih0aGlzLmhlYWRlckZpbHRlcnMgJiYgdGhpcy5oZWFkZXJGaWx0ZXJzLmxlbmd0aCA+IDApXHJcbiAgICAvLyAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcigpXHJcbiAgfVxyXG5cclxuICBoYW5kbGVyRmlsdGVyc0RhdGUoZGVsZXRlRmlsdGVyOmJvb2xlYW4sIGl0ZW06YW55LCB2YWx1ZURhdGUgPSBudWxsLCB2YWx1ZUJldHdlZW4xID0gbnVsbCwgdmFsdWVCZXR3ZWVuMiA9IG51bGwpe1xyXG4gICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgaWYoZGVsZXRlRmlsdGVyKXtcclxuICAgICAgICAgIHRoaXMuZGVsdGVGaWx0ZXIoe1xyXG4gICAgICAgICAgICBsYWJlbEZpbHRlcjonRmVjaGEgZW50cmUnLFxyXG4gICAgICAgICAgICB0eXBlOidkYXRlUmFuZ2UnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5sb2FkRGF0ZXMobmV3IERhdGUodmFsdWVEYXRlICsgXCJUMDU6MDA6MDAuMDAwWlwiKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcclxuICAgICAgICBpZihkZWxldGVGaWx0ZXIpe1xyXG4gICAgICAgICAgdGhpcy5kZWx0ZUZpbHRlcih7XHJcbiAgICAgICAgICAgIGxhYmVsRmlsdGVyOidGZWNoYSBpZ3VhbCBhJyxcclxuICAgICAgICAgICAgdHlwZTonZGF0ZSdcclxuICAgICAgICB9KVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5sb2FkRGF0ZXNCZXR3ZWVuKGZhbHNlLCBuZXcgRGF0ZSh2YWx1ZUJldHdlZW4xICsgXCJUMDU6MDA6MDAuMDAwWlwiKSAsIG5ldyBEYXRlKHZhbHVlQmV0d2VlbjIgKyBcIlQwNTowMDowMC4wMDBaXCIpKVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdEZpbHRlcigkZXZlbnQpe1xyXG4gICAgbGV0IHZhbGlkYXRlID0gdGhpcy5oZWFkZXJGaWx0ZXJzU2VsZWN0ZWQuZmluZCh4ID0+IHgubGFiZWxGaWx0ZXIgPT0gJGV2ZW50LnZhbHVlKVxyXG4gICAgaWYoIXZhbGlkYXRlKXtcclxuICAgICAgbGV0IHZhbHVlID0gdGhpcy5oZWFkZXJGaWx0ZXJzLmZpbmQoeCA9PiB4LmxhYmVsRmlsdGVyID09ICRldmVudC52YWx1ZSlcclxuICAgICAgaWYodmFsdWUpe1xyXG4gICAgICAgIHRoaXMuaGVhZGVyRmlsdGVyc1NlbGVjdGVkLnB1c2godmFsdWUpXHJcbiAgICAgICAgdGhpcy5oYW5kbGVyRmlsdGVyc0RhdGUodHJ1ZSAsIHt0eXBlOnZhbHVlLnR5cGV9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5oZWFkZXJGaWx0ZXJzVmFsdWUgPSBudWxsXHJcbiAgICB9LCA1MDApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2VsZWN0RmlsdGVyRGF0YSgkZXZlbnQsIGl0ZW0pe1xyXG4gICAgbGV0IGkgPSB0aGlzLmhlYWRlckZpbHRlcnNTZWxlY3RlZC5maW5kSW5kZXgoeCA9PiB4LmxhYmVsRmlsdGVyID09IGl0ZW0ubGFiZWxGaWx0ZXIpXHJcbiAgICBpZihpID49IDAgKSB0aGlzLmhlYWRlckZpbHRlcnNTZWxlY3RlZFtpXS52YWx1ZSA9ICRldmVudC52YWx1ZVxyXG4gICAgbGV0IGYgPSB0aGlzLmZpbHRlcnNQb3N0LmZpbmRJbmRleCh4ID0+IHgubGFiZWxGaWx0ZXIgPT0gaXRlbS5sYWJlbEZpbHRlcilcclxuICAgIGlmKCRldmVudC52YWx1ZSl7XHJcbiAgICAgIGxldCB2YWx1ZSA9IG51bGxcclxuICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcclxuICAgICAgICBjYXNlICdzZWxlY3QnOlxyXG4gICAgICAgICAgdmFsdWUgPSAkZXZlbnQudmFsdWVcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmZ1bmN0aW9uRXRlci5kYXRlREIoJGV2ZW50LnZhbHVlKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICdkYXRlUmFuZ2UnOlxyXG4gICAgICAgICAgdmFsdWUgPSBgJHt0aGlzLmZ1bmN0aW9uRXRlci5kYXRlREIodGhpcy5jYW1wYWlnbk9uZS5jb250cm9scy5zdGFydC52YWx1ZSl9LCR7dGhpcy5mdW5jdGlvbkV0ZXIuZGF0ZURCKHRoaXMuY2FtcGFpZ25PbmUuY29udHJvbHMuZW5kLnZhbHVlKX1gXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYoIXZhbHVlKSByZXR1cm5cclxuICAgICAgaWYoZiA+PSAwKXtcclxuICAgICAgICB0aGlzLmZpbHRlcnNQb3N0W2ZdLnZhbHVlID0gdmFsdWVcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzUG9zdC5wdXNoKHtcclxuICAgICAgICAgIHROOmJ0b2EoaXRlbS50TiksXHJcbiAgICAgICAgICBwcmltYXJ5S2V5Oml0ZW0uZmlsZU5hbWVEYj9pdGVtLmZpbGVOYW1lRGI6aXRlbS5wcmltYXJ5S2V5LFxyXG4gICAgICAgICAgdHlwZTppdGVtLnR5cGUsXHJcbiAgICAgICAgICB2YWx1ZTp2YWx1ZSxcclxuICAgICAgICAgIGxhYmVsRmlsdGVyOml0ZW0ubGFiZWxGaWx0ZXJcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzLmVtaXQodGhpcy5maWx0ZXJzUG9zdClcclxuICAgIH1cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgZGVsdGVGaWx0ZXIoaXRlbSl7XHJcbiAgICBsZXQgaSA9IHRoaXMuaGVhZGVyRmlsdGVyc1NlbGVjdGVkLmZpbmRJbmRleCh4ID0+IHgubGFiZWxGaWx0ZXIgPT0gaXRlbS5sYWJlbEZpbHRlcilcclxuICAgIGxldCBmID0gdGhpcy5maWx0ZXJzUG9zdC5maW5kSW5kZXgoeCA9PiB4LmxhYmVsRmlsdGVyID09IGl0ZW0ubGFiZWxGaWx0ZXIpXHJcbiAgICBpZihpID49IDApIHtcclxuICAgICAgdGhpcy5oZWFkZXJGaWx0ZXJzU2VsZWN0ZWRbaV0udmFsdWUgPSBcIi0xXCJcclxuICAgICAgdGhpcy5oZWFkZXJGaWx0ZXJzU2VsZWN0ZWQuc3BsaWNlKGksIDEpXHJcbiAgICB9XHJcbiAgICBpZihmID49IDApIHtcclxuICAgICAgdGhpcy5maWx0ZXJzUG9zdC5zcGxpY2UoZiwxKVxyXG4gICAgICB0aGlzLmFwcGx5RmlsdGVycy5lbWl0KHRoaXMuZmlsdGVyc1Bvc3QpXHJcbiAgICB9XHJcbiAgICB0aGlzLmhhbmRsZXJGaWx0ZXJzRGF0ZShmYWxzZSwgaXRlbSlcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmhlYWRlckZpbHRlcnNWYWx1ZSA9IG51bGxcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICBsb2FkRGF0ZXModmFsdWUgOiBEYXRlID0gbnVsbCl7XHJcbiAgICB0aGlzLmZlY2hhID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xyXG4gICAgICBmZWNoYTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh2YWx1ZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZERhdGVzQmV0d2Vlbihpbml0OmJvb2xlYW4gPSB0cnVlLCB2YWx1ZTEgOiBEYXRlID0gbnVsbCwgdmFsdWUyIDogRGF0ZSA9IG51bGwpe1xyXG4gICAgaWYoaW5pdCl7XHJcbiAgICAgIHRoaXMuY2FtcGFpZ25PbmUgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7XHJcbiAgICAgICAgc3RhcnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgZW5kOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuY2FtcGFpZ25Ud28gPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7XHJcbiAgICAgICAgc3RhcnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgZW5kOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB2YXIgZGF5MSA9IDFcclxuICAgIHZhciBkYXkyID0gMTVcclxuICAgIGlmKCF2YWx1ZTEpe1xyXG4gICAgICB2YWx1ZTEgPSBuZXcgRGF0ZSgpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgZGF5MSA9IHZhbHVlMS5nZXREYXRlKClcclxuICAgIH1cclxuXHJcbiAgICBpZighdmFsdWUyKXtcclxuICAgICAgdmFsdWUyID0gbmV3IERhdGUoKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGRheTIgPSB2YWx1ZTIuZ2V0RGF0ZSgpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYW1wYWlnbk9uZSA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcclxuICAgICAgc3RhcnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobmV3IERhdGUodmFsdWUxLmdldEZ1bGxZZWFyKCksIHZhbHVlMS5nZXRNb250aCgpLCBkYXkxKSksXHJcbiAgICAgIGVuZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChuZXcgRGF0ZSh2YWx1ZTIuZ2V0RnVsbFllYXIoKSwgdmFsdWUyLmdldE1vbnRoKCksIGRheTIpKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FtcGFpZ25Ud28gPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7XHJcbiAgICAgIHN0YXJ0OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKG5ldyBEYXRlKHZhbHVlMS5nZXRGdWxsWWVhcigpLCB2YWx1ZTEuZ2V0TW9udGgoKSwgZGF5MSkpLFxyXG4gICAgICBlbmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobmV3IERhdGUodmFsdWUxLmdldEZ1bGxZZWFyKCksIHZhbHVlMS5nZXRNb250aCgpLCBkYXkxKSksXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2FkRmlsdGVyKCl7XHJcbiAgICAvLyBpZiAodGhpcy5oZWFkZXJGaWx0ZXJzU2VsZWN0ZWQubGVuZ3RoICE9IDApIHtcclxuICAgIC8vICAgcmV0dXJuXHJcbiAgICAvLyB9XHJcbiAgICBsZXQgYXBwbHlGaWx0ZXIgPSBmYWxzZSBcclxuICAgIGZvcihsZXQgZWxlbWVudCBvZiB0aGlzLmhlYWRlckZpbHRlcnMpe1xyXG4gICAgIFxyXG4gICAgICBpZihlbGVtZW50LnVybERhdGEpe1xyXG4gICAgICAgIGxldCByZXMgPSBhd2FpdCB0aGlzLmh0dHAuZ2V0RGF0YUJvZHk8YW55PihlbGVtZW50LnVybERhdGEpXHJcbiAgICAgICAgZWxlbWVudC5ib2R5ID0gcmVzO1xyXG4gICAgICB9ZWxzZSBpZiAoZWxlbWVudC50eXBlID09ICdzZWxlY3QnKSB7ICAgICAgIFxyXG4gICAgICAgIGVsZW1lbnQuYm9keSA9IGVsZW1lbnQuZGF0YSAgICAgIFxyXG4gICAgICB9XHJcbiAgICAgIGVsZW1lbnQuZmlsdGVyZWRMaXN0ID0gZWxlbWVudC5ib2R5O1xyXG4gICAgICBpZighZWxlbWVudC5wcmltYXJ5S2V5KSBlbGVtZW50LnByaW1hcnlLZXkgPSBlbGVtZW50LnZpc2libGVGaWVsZFxyXG4gICAgICBpZihlbGVtZW50LnR5cGUgPT0gXCJkYXRlXCIpIGVsZW1lbnQubGFiZWxGaWx0ZXIgPSBlbGVtZW50LmxhYmVsRmlsdGVyID8/IFwiRmVjaGEgaWd1YWwgYVwiXHJcbiAgICAgIGlmKGVsZW1lbnQudHlwZSA9PSBcImRhdGVSYW5nZVwiKSBlbGVtZW50LmxhYmVsRmlsdGVyID0gZWxlbWVudC5sYWJlbEZpbHRlciA/PyBcIkZlY2hhIGVudHJlXCJcclxuICAgICAgaWYoZWxlbWVudC5hY3RpdmUpIHtcclxuICAgICAgICB0aGlzLmhlYWRlckZpbHRlcnNTZWxlY3RlZC5wdXNoKGVsZW1lbnQpXHJcbiAgICAgICAgdGhpcy5maWx0ZXJzUG9zdC5wdXNoKHtcclxuICAgICAgICAgIHROOmJ0b2EoZWxlbWVudC50TiksXHJcbiAgICAgICAgICBwcmltYXJ5S2V5OmVsZW1lbnQuZmlsZU5hbWVEYj9lbGVtZW50LmZpbGVOYW1lRGI6ZWxlbWVudC5wcmltYXJ5S2V5LFxyXG4gICAgICAgICAgdHlwZTplbGVtZW50LnR5cGUsXHJcbiAgICAgICAgICB2YWx1ZTplbGVtZW50LnZhbHVlLFxyXG4gICAgICAgICAgbGFiZWxGaWx0ZXI6ZWxlbWVudC5sYWJlbEZpbHRlclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5oYW5kbGVyRmlsdGVyc0RhdGUoZmFsc2UsIGVsZW1lbnQsIGVsZW1lbnQudmFsdWUsIGVsZW1lbnQudmFsdWUuc3BsaXQoJywnKVswXSwgZWxlbWVudC52YWx1ZS5zcGxpdCgnLCcpWzFdKVxyXG4gICAgICAgIGlmIChlbGVtZW50LnZhbHVlICYmIGVsZW1lbnQudmFsdWUgIT0gJycpIHtcclxuICAgICAgICAgIGFwcGx5RmlsdGVyID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGFwcGx5RmlsdGVyKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzLmVtaXQodGhpcy5maWx0ZXJzUG9zdCkgICAgICBcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImhlYWRlckZpbHRlcnMgJiYgaGVhZGVyRmlsdGVycy5sZW5ndGggPiAwXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyB3aWR0aDogMTAwJTsgZmxleC13cmFwOiB3cmFwO1wiIGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgY29sLTEyXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgPlxyXG4gICAgICA8bWF0LWxhYmVsPkZpbHRyb3M8L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3RGaWx0ZXIoJGV2ZW50KVwiIFsobmdNb2RlbCldPVwiaGVhZGVyRmlsdGVyc1ZhbHVlXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIGhlYWRlckZpbHRlcnNcIlxyXG4gICAgICAgICAgdmFsdWU9XCJ7eyBmLmxhYmVsRmlsdGVyIH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBmLmxhYmVsRmlsdGVyIH19XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGhlYWRlckZpbHRlcnNTZWxlY3RlZFwiIGNsYXNzPVwiY29sLW1kLTQgY29sLTEyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiaXRlbS50eXBlID09ICdzZWxlY3QnXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5GaWx0cmFyIHBvciB7e2l0ZW0ubGFiZWxGaWx0ZXJ9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0RmlsdGVyRGF0YSgkZXZlbnQsIGl0ZW0pXCIgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIj5cclxuICAgICAgICAgIDxhcHAtc2VsZWN0LWZpbHRlclxyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0ZpbHRlcidcIlxyXG4gICAgICAgICAgICBbZGlzcGxheU1lbWJlcl09XCJpdGVtLnZpc2libGVGaWVsZFwiXHJcbiAgICAgICAgICAgIFthcnJheV09XCJpdGVtLmJvZHlcIlxyXG4gICAgICAgICAgICAoZmlsdGVyZWRSZXR1cm4pPVwiaXRlbS5maWx0ZXJlZExpc3QgPSAkZXZlbnRcIlxyXG4gICAgICAgICAgICBbbm9SZXN1bHRzTWVzc2FnZV09XCInTm8gaGF5IHJlc3VsdGFkb3MnXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvYXBwLXNlbGVjdC1maWx0ZXI+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YSBvZiBpdGVtLmZpbHRlcmVkTGlzdFwiXHJcbiAgICAgICAgICAgIHZhbHVlPVwie3sgZGF0YVtpdGVtLnByaW1hcnlLZXldIH19XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZGF0YVtpdGVtLnZpc2libGVGaWVsZF0gfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZGF0ZSdcIiBbZm9ybUdyb3VwXT1cImZlY2hhXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnt7aXRlbS5sYWJlbEZpbHRlcn19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgKGRhdGVJbnB1dCk9XCJzZWxlY3RGaWx0ZXJEYXRhKCRldmVudCwgaXRlbSlcIiBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJGZWNoYVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdmZWNoYScgcmVxdWlyZWQ+XHJcbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cIkZlY2hhXCI+XHJcbiAgICAgICAgICA8L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciBkYXRlSW5wdXQgI0ZlY2hhIFt0b3VjaFVpXT0nbW92aWw/dHJ1ZTpmYWxzZSc+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZGF0ZVJhbmdlJ1wiPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3tpdGVtLmxhYmVsRmlsdGVyfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXRcclxuICAgICAgICAgIFtmb3JtR3JvdXBdPVwiY2FtcGFpZ25PbmVcIlxyXG4gICAgICAgICAgW3JhbmdlUGlja2VyXT1cImNhbXBhaWduT25lUGlja2VyXCJcclxuICAgICAgICAgIFtjb21wYXJpc29uU3RhcnRdPVwiY2FtcGFpZ25Ud28udmFsdWUuc3RhcnRcIlxyXG4gICAgICAgICAgW2NvbXBhcmlzb25FbmRdPVwiY2FtcGFpZ25Ud28udmFsdWUuZW5kXCI+XHJcbiAgICAgICAgICA8aW5wdXQgIG1hdFN0YXJ0RGF0ZSBwbGFjZWhvbGRlcj1cIlN0YXJ0IGRhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGFydFwiPlxyXG4gICAgICAgICAgPGlucHV0IChkYXRlSW5wdXQpPVwic2VsZWN0RmlsdGVyRGF0YSgkZXZlbnQsIGl0ZW0pXCIgbWF0RW5kRGF0ZSBwbGFjZWhvbGRlcj1cIkVuZCBkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZW5kXCI+XHJcbiAgICAgICAgPC9tYXQtZGF0ZS1yYW5nZS1pbnB1dD5cclxuICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cImNhbXBhaWduT25lUGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgPG1hdC1kYXRlLXJhbmdlLXBpY2tlciAjY2FtcGFpZ25PbmVQaWNrZXI+PC9tYXQtZGF0ZS1yYW5nZS1waWNrZXI+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicC0yXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIiAoY2xpY2spPVwiZGVsdGVGaWx0ZXIoaXRlbSlcIj48bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj48L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
1
+ import { ScreenSizeUtil } from '../../../services/screen-size-util';
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../../services/functions.service";
6
+ import * as i2 from "../../../services/http.service";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "@angular/material/icon";
9
+ import * as i5 from "@angular/material/form-field";
10
+ import * as i6 from "@angular/material/input";
11
+ import * as i7 from "@angular/material/select";
12
+ import * as i8 from "@angular/material/core";
13
+ import * as i9 from "@angular/material/datepicker";
14
+ import * as i10 from "@angular/forms";
15
+ import * as i11 from "../select-filter/select-filter.component";
16
+ export class FiltersComponent {
17
+ constructor(functionEter, http) {
18
+ this.functionEter = functionEter;
19
+ this.http = http;
20
+ this.headerFilters = [];
21
+ this.applyFilters = new EventEmitter();
22
+ this.headerFiltersValue = "-1";
23
+ this.headerFiltersSelected = [];
24
+ this.movil = ScreenSizeUtil.isMobile();
25
+ this.filtersPost = [];
26
+ this.loadDates();
27
+ this.loadDatesBetween();
28
+ }
29
+ async ngOnChanges(changes) {
30
+ if (changes) {
31
+ await this.loadFilter();
32
+ }
33
+ }
34
+ async ngOnInit() {
35
+ // if(this.headerFilters && this.headerFilters.length > 0)
36
+ // await this.loadFilter()
37
+ }
38
+ handlerFiltersDate(deleteFilter, item, valueDate = null, valueBetween1 = null, valueBetween2 = null) {
39
+ switch (item.type) {
40
+ case 'date':
41
+ if (deleteFilter) {
42
+ this.delteFilter({
43
+ labelFilter: 'Fecha entre',
44
+ type: 'dateRange'
45
+ });
46
+ }
47
+ else {
48
+ this.loadDates(new Date(valueDate + "T05:00:00.000Z"));
49
+ }
50
+ break;
51
+ case 'dateRange':
52
+ if (deleteFilter) {
53
+ this.delteFilter({
54
+ labelFilter: 'Fecha igual a',
55
+ type: 'date'
56
+ });
57
+ }
58
+ else {
59
+ this.loadDatesBetween(false, new Date(valueBetween1 + "T05:00:00.000Z"), new Date(valueBetween2 + "T05:00:00.000Z"));
60
+ }
61
+ break;
62
+ default:
63
+ break;
64
+ }
65
+ }
66
+ selectFilter($event) {
67
+ let validate = this.headerFiltersSelected.find(x => x.labelFilter == $event.value);
68
+ if (!validate) {
69
+ let value = this.headerFilters.find(x => x.labelFilter == $event.value);
70
+ if (value) {
71
+ this.headerFiltersSelected.push(value);
72
+ this.handlerFiltersDate(true, { type: value.type });
73
+ }
74
+ }
75
+ setTimeout(() => {
76
+ this.headerFiltersValue = null;
77
+ }, 500);
78
+ }
79
+ async selectFilterData($event, item) {
80
+ let i = this.headerFiltersSelected.findIndex(x => x.labelFilter == item.labelFilter);
81
+ if (i >= 0)
82
+ this.headerFiltersSelected[i].value = $event.value;
83
+ let f = this.filtersPost.findIndex(x => x.labelFilter == item.labelFilter);
84
+ if ($event.value) {
85
+ let value = null;
86
+ switch (item.type) {
87
+ case 'select':
88
+ value = $event.value;
89
+ break;
90
+ case 'date':
91
+ value = this.functionEter.dateDB($event.value);
92
+ break;
93
+ case 'dateRange':
94
+ value = `${this.functionEter.dateDB(this.campaignOne.controls.start.value)},${this.functionEter.dateDB(this.campaignOne.controls.end.value)}`;
95
+ break;
96
+ default:
97
+ break;
98
+ }
99
+ if (!value)
100
+ return;
101
+ if (f >= 0) {
102
+ this.filtersPost[f].value = value;
103
+ }
104
+ else {
105
+ this.filtersPost.push({
106
+ tN: btoa(item.tN),
107
+ primaryKey: item.fileNameDb ? item.fileNameDb : item.primaryKey,
108
+ type: item.type,
109
+ value: value,
110
+ labelFilter: item.labelFilter
111
+ });
112
+ }
113
+ this.applyFilters.emit(this.filtersPost);
114
+ }
115
+ }
116
+ delteFilter(item) {
117
+ let i = this.headerFiltersSelected.findIndex(x => x.labelFilter == item.labelFilter);
118
+ let f = this.filtersPost.findIndex(x => x.labelFilter == item.labelFilter);
119
+ if (i >= 0) {
120
+ this.headerFiltersSelected[i].value = "-1";
121
+ this.headerFiltersSelected.splice(i, 1);
122
+ }
123
+ if (f >= 0) {
124
+ this.filtersPost.splice(f, 1);
125
+ this.applyFilters.emit(this.filtersPost);
126
+ }
127
+ this.handlerFiltersDate(false, item);
128
+ setTimeout(() => {
129
+ this.headerFiltersValue = null;
130
+ }, 500);
131
+ }
132
+ loadDates(value = null) {
133
+ this.fecha = new UntypedFormGroup({
134
+ fecha: new UntypedFormControl(value)
135
+ });
136
+ }
137
+ loadDatesBetween(init = true, value1 = null, value2 = null) {
138
+ if (init) {
139
+ this.campaignOne = new UntypedFormGroup({
140
+ start: new UntypedFormControl(null),
141
+ end: new UntypedFormControl(null),
142
+ });
143
+ this.campaignTwo = new UntypedFormGroup({
144
+ start: new UntypedFormControl(null),
145
+ end: new UntypedFormControl(null),
146
+ });
147
+ return;
148
+ }
149
+ var day1 = 1;
150
+ var day2 = 15;
151
+ if (!value1) {
152
+ value1 = new Date();
153
+ }
154
+ else {
155
+ day1 = value1.getDate();
156
+ }
157
+ if (!value2) {
158
+ value2 = new Date();
159
+ }
160
+ else {
161
+ day2 = value2.getDate();
162
+ }
163
+ this.campaignOne = new UntypedFormGroup({
164
+ start: new UntypedFormControl(new Date(value1.getFullYear(), value1.getMonth(), day1)),
165
+ end: new UntypedFormControl(new Date(value2.getFullYear(), value2.getMonth(), day2)),
166
+ });
167
+ this.campaignTwo = new UntypedFormGroup({
168
+ start: new UntypedFormControl(new Date(value1.getFullYear(), value1.getMonth(), day1)),
169
+ end: new UntypedFormControl(new Date(value1.getFullYear(), value1.getMonth(), day1)),
170
+ });
171
+ }
172
+ async loadFilter() {
173
+ // if (this.headerFiltersSelected.length != 0) {
174
+ // return
175
+ // }
176
+ let applyFilter = false;
177
+ for (let element of this.headerFilters) {
178
+ if (element.urlData) {
179
+ let res = await this.http.getDataBody(element.urlData);
180
+ element.body = res;
181
+ }
182
+ else if (element.type == 'select') {
183
+ element.body = element.data;
184
+ }
185
+ element.filteredList = element.body;
186
+ if (!element.primaryKey)
187
+ element.primaryKey = element.visibleField;
188
+ if (element.type == "date")
189
+ element.labelFilter = element.labelFilter ?? "Fecha igual a";
190
+ if (element.type == "dateRange")
191
+ element.labelFilter = element.labelFilter ?? "Fecha entre";
192
+ if (element.active) {
193
+ this.headerFiltersSelected.push(element);
194
+ this.filtersPost.push({
195
+ tN: btoa(element.tN),
196
+ primaryKey: element.fileNameDb ? element.fileNameDb : element.primaryKey,
197
+ type: element.type,
198
+ value: element.value,
199
+ labelFilter: element.labelFilter
200
+ });
201
+ this.handlerFiltersDate(false, element, element.value, element.value.split(',')[0], element.value.split(',')[1]);
202
+ if (element.value && element.value != '') {
203
+ applyFilter = true;
204
+ }
205
+ }
206
+ }
207
+ if (applyFilter) {
208
+ this.applyFilters.emit(this.filtersPost);
209
+ }
210
+ }
211
+ }
212
+ FiltersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FiltersComponent, deps: [{ token: i1.FunctionsService }, { token: i2.HttpService }], target: i0.ɵɵFactoryTarget.Component });
213
+ FiltersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FiltersComponent, selector: "app-filters", inputs: { headerFilters: "headerFilters" }, outputs: { applyFilters: "applyFilters" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"headerFilters && headerFilters.length > 0\" style=\"display: flex; width: 100%; flex-wrap: wrap;\" class=\"col-12 mb-2\">\n <div class=\"col-md-4 col-12\">\n <mat-form-field >\n <mat-label>Filtros</mat-label>\n <mat-select (selectionChange)=\"selectFilter($event)\" [(ngModel)]=\"headerFiltersValue\">\n <mat-option\n *ngFor=\"let f of headerFilters\"\n value=\"{{ f.labelFilter }}\"\n >\n {{ f.labelFilter }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div *ngFor=\"let item of headerFiltersSelected\" class=\"col-md-4 col-12 d-flex align-items-center\">\n <mat-form-field *ngIf=\"item.type == 'select'\">\n <mat-label>Filtrar por {{item.labelFilter}}</mat-label>\n <mat-select (selectionChange)=\"selectFilterData($event, item)\" [value]=\"item.value\">\n <app-select-filter\n [placeholder]=\"'Filter'\"\n [displayMember]=\"item.visibleField\"\n [array]=\"item.body\"\n (filteredReturn)=\"item.filteredList = $event\"\n [noResultsMessage]=\"'No hay resultados'\"\n >\n </app-select-filter>\n <mat-option\n *ngFor=\"let data of item.filteredList\"\n value=\"{{ data[item.primaryKey] }}\"\n >\n {{ data[item.visibleField] }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"item.type == 'date'\" [formGroup]=\"fecha\">\n <mat-label>{{item.labelFilter}}</mat-label>\n <input (dateInput)=\"selectFilterData($event, item)\" matInput [matDatepicker]=\"Fecha\" autocomplete=\"off\" matInput\n formControlName='fecha' required>\n <mat-datepicker-toggle matSuffix [for]=\"Fecha\">\n </mat-datepicker-toggle>\n <mat-datepicker dateInput #Fecha [touchUi]='movil?true:false'></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"item.type == 'dateRange'\">\n <mat-label>{{item.labelFilter}}</mat-label>\n <mat-date-range-input\n [formGroup]=\"campaignOne\"\n [rangePicker]=\"campaignOnePicker\"\n [comparisonStart]=\"campaignTwo.value.start\"\n [comparisonEnd]=\"campaignTwo.value.end\">\n <input matStartDate placeholder=\"Start date\" formControlName=\"start\">\n <input (dateInput)=\"selectFilterData($event, item)\" matEndDate placeholder=\"End date\" formControlName=\"end\">\n </mat-date-range-input>\n <mat-datepicker-toggle matSuffix [for]=\"campaignOnePicker\"></mat-datepicker-toggle>\n <mat-date-range-picker #campaignOnePicker></mat-date-range-picker>\n </mat-form-field>\n\n <div class=\"p-2\" style=\"cursor: pointer\" (click)=\"delteFilter(item)\"><mat-icon>cancel</mat-icon></div>\n\n </div>\n</div>\n", styles: ["mat-form-field{padding:0!important;width:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i6.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: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i9.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i9.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i9.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i9.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i9.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i9.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.SelectFilterComponent, selector: "app-select-filter", inputs: ["array", "placeholder", "color", "displayMember", "showSpinner", "noResultsMessage", "hasGroup", "groupArrayName"], outputs: ["filteredReturn"] }] });
214
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FiltersComponent, decorators: [{
215
+ type: Component,
216
+ args: [{ selector: 'app-filters', template: "<div *ngIf=\"headerFilters && headerFilters.length > 0\" style=\"display: flex; width: 100%; flex-wrap: wrap;\" class=\"col-12 mb-2\">\n <div class=\"col-md-4 col-12\">\n <mat-form-field >\n <mat-label>Filtros</mat-label>\n <mat-select (selectionChange)=\"selectFilter($event)\" [(ngModel)]=\"headerFiltersValue\">\n <mat-option\n *ngFor=\"let f of headerFilters\"\n value=\"{{ f.labelFilter }}\"\n >\n {{ f.labelFilter }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div *ngFor=\"let item of headerFiltersSelected\" class=\"col-md-4 col-12 d-flex align-items-center\">\n <mat-form-field *ngIf=\"item.type == 'select'\">\n <mat-label>Filtrar por {{item.labelFilter}}</mat-label>\n <mat-select (selectionChange)=\"selectFilterData($event, item)\" [value]=\"item.value\">\n <app-select-filter\n [placeholder]=\"'Filter'\"\n [displayMember]=\"item.visibleField\"\n [array]=\"item.body\"\n (filteredReturn)=\"item.filteredList = $event\"\n [noResultsMessage]=\"'No hay resultados'\"\n >\n </app-select-filter>\n <mat-option\n *ngFor=\"let data of item.filteredList\"\n value=\"{{ data[item.primaryKey] }}\"\n >\n {{ data[item.visibleField] }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"item.type == 'date'\" [formGroup]=\"fecha\">\n <mat-label>{{item.labelFilter}}</mat-label>\n <input (dateInput)=\"selectFilterData($event, item)\" matInput [matDatepicker]=\"Fecha\" autocomplete=\"off\" matInput\n formControlName='fecha' required>\n <mat-datepicker-toggle matSuffix [for]=\"Fecha\">\n </mat-datepicker-toggle>\n <mat-datepicker dateInput #Fecha [touchUi]='movil?true:false'></mat-datepicker>\n </mat-form-field>\n\n <mat-form-field *ngIf=\"item.type == 'dateRange'\">\n <mat-label>{{item.labelFilter}}</mat-label>\n <mat-date-range-input\n [formGroup]=\"campaignOne\"\n [rangePicker]=\"campaignOnePicker\"\n [comparisonStart]=\"campaignTwo.value.start\"\n [comparisonEnd]=\"campaignTwo.value.end\">\n <input matStartDate placeholder=\"Start date\" formControlName=\"start\">\n <input (dateInput)=\"selectFilterData($event, item)\" matEndDate placeholder=\"End date\" formControlName=\"end\">\n </mat-date-range-input>\n <mat-datepicker-toggle matSuffix [for]=\"campaignOnePicker\"></mat-datepicker-toggle>\n <mat-date-range-picker #campaignOnePicker></mat-date-range-picker>\n </mat-form-field>\n\n <div class=\"p-2\" style=\"cursor: pointer\" (click)=\"delteFilter(item)\"><mat-icon>cancel</mat-icon></div>\n\n </div>\n</div>\n", styles: ["mat-form-field{padding:0!important;width:100%}\n"] }]
217
+ }], ctorParameters: function () { return [{ type: i1.FunctionsService }, { type: i2.HttpService }]; }, propDecorators: { headerFilters: [{
218
+ type: Input
219
+ }], applyFilters: [{
220
+ type: Output
221
+ }] } });
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBVyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBU3RFLE1BQU0sT0FBTyxnQkFBZ0I7SUFlM0IsWUFDVSxZQUE4QixFQUM5QixJQUFpQjtRQURqQixpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFDOUIsU0FBSSxHQUFKLElBQUksQ0FBYTtRQWZsQixrQkFBYSxHQUFlLEVBQUUsQ0FBQTtRQUM3QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFakQsdUJBQWtCLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLDBCQUFxQixHQUFnQixFQUFFLENBQUE7UUFJdkMsVUFBSyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUdsQyxnQkFBVyxHQUFHLEVBQUUsQ0FBQTtRQU1kLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBQ0YsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFzQjtRQUN0QyxJQUFLLE9BQU8sRUFBRTtZQUNaLE1B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MkZEbERhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxhQUFhO2lJQU1kLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaHR0cC5zZXJ2aWNlJztcbmltcG9ydCB7IEZ1bmN0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mdW5jdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBTY3JlZW5TaXplVXRpbCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3NjcmVlbi1zaXplLXV0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBEb0NoZWNrLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBlbGVtZW50IH0gZnJvbSAncHJvdHJhY3Rvcic7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZpbHRlcnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVycy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlcnMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIGhlYWRlckZpbHRlcnM6IEFycmF5PGFueT4gPSBbXVxuICBAT3V0cHV0KCkgYXBwbHlGaWx0ZXJzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgaGVhZGVyRmlsdGVyc1ZhbHVlID0gXCItMVwiXG4gIGhlYWRlckZpbHRlcnNTZWxlY3RlZCA6IEFycmF5PGFueT4gPSBbXVxuICBjYW1wYWlnbk9uZTogVW50eXBlZEZvcm1Hcm91cDtcbiAgY2FtcGFpZ25Ud286IFVudHlwZWRGb3JtR3JvdXA7XG4gIGZlY2hhOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBtb3ZpbCA9IFNjcmVlblNpemVVdGlsLmlzTW9iaWxlKCk7XG5cblxuICBmaWx0ZXJzUG9zdCA9IFtdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmdW5jdGlvbkV0ZXI6IEZ1bmN0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5sb2FkRGF0ZXMoKVxuICAgIHRoaXMubG9hZERhdGVzQmV0d2VlbigpXG4gICB9XG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoIGNoYW5nZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZEZpbHRlcigpXG4gICAgfVxuICB9ICBcblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAvLyBpZih0aGlzLmhlYWRlckZpbHRlcnMgJiYgdGhpcy5oZWFkZXJGaWx0ZXJzLmxlbmd0aCA+IDApXG4gICAgLy8gICBhd2FpdCB0aGlzLmxvYWRGaWx0ZXIoKVxuICB9XG5cbiAgaGFuZGxlckZpbHRlcnNEYXRlKGRlbGV0ZUZpbHRlcjpib29sZWFuLCBpdGVtOmFueSwgdmFsdWVEYXRlID0gbnVsbCwgdmFsdWVCZXR3ZWVuMSA9IG51bGwsIHZhbHVlQmV0d2VlbjIgPSBudWxsKXtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIGlmKGRlbGV0ZUZpbHRlcil7XG4gICAgICAgICAgdGhpcy5kZWx0ZUZpbHRlcih7XG4gICAgICAgICAgICBsYWJlbEZpbHRlcjonRmVjaGEgZW50cmUnLFxuICAgICAgICAgICAgdHlwZTonZGF0ZVJhbmdlJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgIHRoaXMubG9hZERhdGVzKG5ldyBEYXRlKHZhbHVlRGF0ZSArIFwiVDA1OjAwOjAwLjAwMFpcIikpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIGlmKGRlbGV0ZUZpbHRlcil7XG4gICAgICAgICAgdGhpcy5kZWx0ZUZpbHRlcih7XG4gICAgICAgICAgICBsYWJlbEZpbHRlcjonRmVjaGEgaWd1YWwgYScsXG4gICAgICAgICAgICB0eXBlOidkYXRlJ1xuICAgICAgICB9KVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICB0aGlzLmxvYWREYXRlc0JldHdlZW4oZmFsc2UsIG5ldyBEYXRlKHZhbHVlQmV0d2VlbjEgKyBcIlQwNTowMDowMC4wMDBaXCIpICwgbmV3IERhdGUodmFsdWVCZXR3ZWVuMiArIFwiVDA1OjAwOjAwLjAwMFpcIikpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0RmlsdGVyKCRldmVudCl7XG4gICAgbGV0IHZhbGlkYXRlID0gdGhpcy5oZWFkZXJGaWx0ZXJzU2VsZWN0ZWQuZmluZCh4ID0+IHgubGFiZWxGaWx0ZXIgPT0gJGV2ZW50LnZhbHVlKVxuICAgIGlmKCF2YWxpZGF0ZSl7XG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLmhlYWRlckZpbHRlcnMuZmluZCh4ID0+IHgubGFiZWxGaWx0ZXIgPT0gJGV2ZW50LnZhbHVlKVxuICAgICAgaWYodmFsdWUpe1xuICAgICAgICB0aGlzLmhlYWRlckZpbHRlcnNTZWxlY3RlZC5wdXNoKHZhbHVlKVxuICAgICAgICB0aGlzLmhhbmRsZXJGaWx0ZXJzRGF0ZSh0cnVlICwge3R5cGU6dmFsdWUudHlwZX0pXG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oZWFkZXJGaWx0ZXJzVmFsdWUgPSBudWxsXG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIGFzeW5jIHNlbGVjdEZpbHRlckRhdGEoJGV2ZW50LCBpdGVtKXtcbiAgICBsZXQgaSA9IHRoaXMuaGVhZGVyRmlsdGVyc1NlbGVjdGVkLmZpbmRJbmRleCh4ID0+IHgubGFiZWxGaWx0ZXIgPT0gaXRlbS5sYWJlbEZpbHRlcilcbiAgICBpZihpID49IDAgKSB0aGlzLmhlYWRlckZpbHRlcnNTZWxlY3RlZFtpXS52YWx1ZSA9ICRldmVudC52YWx1ZVxuICAgIGxldCBmID0gdGhpcy5maWx0ZXJzUG9zdC5maW5kSW5kZXgoeCA9PiB4LmxhYmVsRmlsdGVyID09IGl0ZW0ubGFiZWxGaWx0ZXIpXG4gICAgaWYoJGV2ZW50LnZhbHVlKXtcbiAgICAgIGxldCB2YWx1ZSA9IG51bGxcbiAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgdmFsdWUgPSAkZXZlbnQudmFsdWVcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmZ1bmN0aW9uRXRlci5kYXRlREIoJGV2ZW50LnZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgICAgdmFsdWUgPSBgJHt0aGlzLmZ1bmN0aW9uRXRlci5kYXRlREIodGhpcy5jYW1wYWlnbk9uZS5jb250cm9scy5zdGFydC52YWx1ZSl9LCR7dGhpcy5mdW5jdGlvbkV0ZXIuZGF0ZURCKHRoaXMuY2FtcGFpZ25PbmUuY29udHJvbHMuZW5kLnZhbHVlKX1gXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYoIXZhbHVlKSByZXR1cm5cbiAgICAgIGlmKGYgPj0gMCl7XG4gICAgICAgIHRoaXMuZmlsdGVyc1Bvc3RbZl0udmFsdWUgPSB2YWx1ZVxuICAgICAgfWVsc2V7XG4gICAgICAgIHRoaXMuZmlsdGVyc1Bvc3QucHVzaCh7XG4gICAgICAgICAgdE46YnRvYShpdGVtLnROKSxcbiAgICAgICAgICBwcmltYXJ5S2V5Oml0ZW0uZmlsZU5hbWVEYj9pdGVtLmZpbGVOYW1lRGI6aXRlbS5wcmltYXJ5S2V5LFxuICAgICAgICAgIHR5cGU6aXRlbS50eXBlLFxuICAgICAgICAgIHZhbHVlOnZhbHVlLFxuICAgICAgICAgIGxhYmVsRmlsdGVyOml0ZW0ubGFiZWxGaWx0ZXJcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzLmVtaXQodGhpcy5maWx0ZXJzUG9zdClcbiAgICB9XG5cblxuICB9XG5cbiAgZGVsdGVGaWx0ZXIoaXRlbSl7XG4gICAgbGV0IGkgPSB0aGlzLmhlYWRlckZpbHRlcnNTZWxlY3RlZC5maW5kSW5kZXgoeCA9PiB4LmxhYmVsRmlsdGVyID09IGl0ZW0ubGFiZWxGaWx0ZXIpXG4gICAgbGV0IGYgPSB0aGlzLmZpbHRlcnNQb3N0LmZpbmRJbmRleCh4ID0+IHgubGFiZWxGaWx0ZXIgPT0gaXRlbS5sYWJlbEZpbHRlcilcbiAgICBpZihpID49IDApIHtcbiAgICAgIHRoaXMuaGVhZGVyRmlsdGVyc1NlbGVjdGVkW2ldLnZhbHVlID0gXCItMVwiXG4gICAgICB0aGlzLmhlYWRlckZpbHRlcnNTZWxlY3RlZC5zcGxpY2UoaSwgMSlcbiAgICB9XG4gICAgaWYoZiA+PSAwKSB7XG4gICAgICB0aGlzLmZpbHRlcnNQb3N0LnNwbGljZShmLDEpXG4gICAgICB0aGlzLmFwcGx5RmlsdGVycy5lbWl0KHRoaXMuZmlsdGVyc1Bvc3QpXG4gICAgfVxuICAgIHRoaXMuaGFuZGxlckZpbHRlcnNEYXRlKGZhbHNlLCBpdGVtKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oZWFkZXJGaWx0ZXJzVmFsdWUgPSBudWxsXG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIGxvYWREYXRlcyh2YWx1ZSA6IERhdGUgPSBudWxsKXtcbiAgICB0aGlzLmZlY2hhID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgZmVjaGE6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodmFsdWUpXG4gICAgfSk7XG4gIH1cblxuICBsb2FkRGF0ZXNCZXR3ZWVuKGluaXQ6Ym9vbGVhbiA9IHRydWUsIHZhbHVlMSA6IERhdGUgPSBudWxsLCB2YWx1ZTIgOiBEYXRlID0gbnVsbCl7XG4gICAgaWYoaW5pdCl7XG4gICAgICB0aGlzLmNhbXBhaWduT25lID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgICBzdGFydDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsKSxcbiAgICAgICAgZW5kOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2FtcGFpZ25Ud28gPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7XG4gICAgICAgIHN0YXJ0OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwpLFxuICAgICAgICBlbmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICB9KTtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgZGF5MSA9IDFcbiAgICB2YXIgZGF5MiA9IDE1XG4gICAgaWYoIXZhbHVlMSl7XG4gICAgICB2YWx1ZTEgPSBuZXcgRGF0ZSgpXG4gICAgfWVsc2V7XG4gICAgICBkYXkxID0gdmFsdWUxLmdldERhdGUoKVxuICAgIH1cblxuICAgIGlmKCF2YWx1ZTIpe1xuICAgICAgdmFsdWUyID0gbmV3IERhdGUoKVxuICAgIH1lbHNle1xuICAgICAgZGF5MiA9IHZhbHVlMi5nZXREYXRlKClcbiAgICB9XG5cbiAgICB0aGlzLmNhbXBhaWduT25lID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgc3RhcnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobmV3IERhdGUodmFsdWUxLmdldEZ1bGxZZWFyKCksIHZhbHVlMS5nZXRNb250aCgpLCBkYXkxKSksXG4gICAgICBlbmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobmV3IERhdGUodmFsdWUyLmdldEZ1bGxZZWFyKCksIHZhbHVlMi5nZXRNb250aCgpLCBkYXkyKSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmNhbXBhaWduVHdvID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgc3RhcnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobmV3IERhdGUodmFsdWUxLmdldEZ1bGxZZWFyKCksIHZhbHVlMS5nZXRNb250aCgpLCBkYXkxKSksXG4gICAgICBlbmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobmV3IERhdGUodmFsdWUxLmdldEZ1bGxZZWFyKCksIHZhbHVlMS5nZXRNb250aCgpLCBkYXkxKSksXG4gICAgfSk7XG5cbiAgfVxuXG4gIGFzeW5jIGxvYWRGaWx0ZXIoKXtcbiAgICAvLyBpZiAodGhpcy5oZWFkZXJGaWx0ZXJzU2VsZWN0ZWQubGVuZ3RoICE9IDApIHtcbiAgICAvLyAgIHJldHVyblxuICAgIC8vIH1cbiAgICBsZXQgYXBwbHlGaWx0ZXIgPSBmYWxzZSBcbiAgICBmb3IobGV0IGVsZW1lbnQgb2YgdGhpcy5oZWFkZXJGaWx0ZXJzKXtcbiAgICAgXG4gICAgICBpZihlbGVtZW50LnVybERhdGEpe1xuICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5odHRwLmdldERhdGFCb2R5PGFueT4oZWxlbWVudC51cmxEYXRhKVxuICAgICAgICBlbGVtZW50LmJvZHkgPSByZXM7XG4gICAgICB9ZWxzZSBpZiAoZWxlbWVudC50eXBlID09ICdzZWxlY3QnKSB7ICAgICAgIFxuICAgICAgICBlbGVtZW50LmJvZHkgPSBlbGVtZW50LmRhdGEgICAgICBcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuZmlsdGVyZWRMaXN0ID0gZWxlbWVudC5ib2R5O1xuICAgICAgaWYoIWVsZW1lbnQucHJpbWFyeUtleSkgZWxlbWVudC5wcmltYXJ5S2V5ID0gZWxlbWVudC52aXNpYmxlRmllbGRcbiAgICAgIGlmKGVsZW1lbnQudHlwZSA9PSBcImRhdGVcIikgZWxlbWVudC5sYWJlbEZpbHRlciA9IGVsZW1lbnQubGFiZWxGaWx0ZXIgPz8gXCJGZWNoYSBpZ3VhbCBhXCJcbiAgICAgIGlmKGVsZW1lbnQudHlwZSA9PSBcImRhdGVSYW5nZVwiKSBlbGVtZW50LmxhYmVsRmlsdGVyID0gZWxlbWVudC5sYWJlbEZpbHRlciA/PyBcIkZlY2hhIGVudHJlXCJcbiAgICAgIGlmKGVsZW1lbnQuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyRmlsdGVyc1NlbGVjdGVkLnB1c2goZWxlbWVudClcbiAgICAgICAgdGhpcy5maWx0ZXJzUG9zdC5wdXNoKHtcbiAgICAgICAgICB0TjpidG9hKGVsZW1lbnQudE4pLFxuICAgICAgICAgIHByaW1hcnlLZXk6ZWxlbWVudC5maWxlTmFtZURiP2VsZW1lbnQuZmlsZU5hbWVEYjplbGVtZW50LnByaW1hcnlLZXksXG4gICAgICAgICAgdHlwZTplbGVtZW50LnR5cGUsXG4gICAgICAgICAgdmFsdWU6ZWxlbWVudC52YWx1ZSxcbiAgICAgICAgICBsYWJlbEZpbHRlcjplbGVtZW50LmxhYmVsRmlsdGVyXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuaGFuZGxlckZpbHRlcnNEYXRlKGZhbHNlLCBlbGVtZW50LCBlbGVtZW50LnZhbHVlLCBlbGVtZW50LnZhbHVlLnNwbGl0KCcsJylbMF0sIGVsZW1lbnQudmFsdWUuc3BsaXQoJywnKVsxXSlcbiAgICAgICAgaWYgKGVsZW1lbnQudmFsdWUgJiYgZWxlbWVudC52YWx1ZSAhPSAnJykge1xuICAgICAgICAgIGFwcGx5RmlsdGVyID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcHBseUZpbHRlcikge1xuICAgICAgdGhpcy5hcHBseUZpbHRlcnMuZW1pdCh0aGlzLmZpbHRlcnNQb3N0KSAgICAgIFxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImhlYWRlckZpbHRlcnMgJiYgaGVhZGVyRmlsdGVycy5sZW5ndGggPiAwXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyB3aWR0aDogMTAwJTsgZmxleC13cmFwOiB3cmFwO1wiIGNsYXNzPVwiY29sLTEyIG1iLTJcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGNvbC0xMlwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCA+XG4gICAgICA8bWF0LWxhYmVsPkZpbHRyb3M8L21hdC1sYWJlbD5cbiAgICAgIDxtYXQtc2VsZWN0IChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0RmlsdGVyKCRldmVudClcIiBbKG5nTW9kZWwpXT1cImhlYWRlckZpbHRlcnNWYWx1ZVwiPlxuICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBmIG9mIGhlYWRlckZpbHRlcnNcIlxuICAgICAgICAgIHZhbHVlPVwie3sgZi5sYWJlbEZpbHRlciB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBmLmxhYmVsRmlsdGVyIH19XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGhlYWRlckZpbHRlcnNTZWxlY3RlZFwiIGNsYXNzPVwiY29sLW1kLTQgY29sLTEyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIml0ZW0udHlwZSA9PSAnc2VsZWN0J1wiPlxuICAgICAgICA8bWF0LWxhYmVsPkZpbHRyYXIgcG9yIHt7aXRlbS5sYWJlbEZpbHRlcn19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0RmlsdGVyRGF0YSgkZXZlbnQsIGl0ZW0pXCIgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIj5cbiAgICAgICAgICA8YXBwLXNlbGVjdC1maWx0ZXJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRmlsdGVyJ1wiXG4gICAgICAgICAgICBbZGlzcGxheU1lbWJlcl09XCJpdGVtLnZpc2libGVGaWVsZFwiXG4gICAgICAgICAgICBbYXJyYXldPVwiaXRlbS5ib2R5XCJcbiAgICAgICAgICAgIChmaWx0ZXJlZFJldHVybik9XCJpdGVtLmZpbHRlcmVkTGlzdCA9ICRldmVudFwiXG4gICAgICAgICAgICBbbm9SZXN1bHRzTWVzc2FnZV09XCInTm8gaGF5IHJlc3VsdGFkb3MnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9hcHAtc2VsZWN0LWZpbHRlcj5cbiAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGEgb2YgaXRlbS5maWx0ZXJlZExpc3RcIlxuICAgICAgICAgICAgdmFsdWU9XCJ7eyBkYXRhW2l0ZW0ucHJpbWFyeUtleV0gfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGRhdGFbaXRlbS52aXNpYmxlRmllbGRdIH19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZGF0ZSdcIiBbZm9ybUdyb3VwXT1cImZlY2hhXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD57e2l0ZW0ubGFiZWxGaWx0ZXJ9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCAoZGF0ZUlucHV0KT1cInNlbGVjdEZpbHRlckRhdGEoJGV2ZW50LCBpdGVtKVwiIG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cIkZlY2hhXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgbWF0SW5wdXRcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdmZWNoYScgcmVxdWlyZWQ+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJGZWNoYVwiPlxuICAgICAgICAgIDwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciBkYXRlSW5wdXQgI0ZlY2hhIFt0b3VjaFVpXT0nbW92aWw/dHJ1ZTpmYWxzZSc+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZGF0ZVJhbmdlJ1wiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7aXRlbS5sYWJlbEZpbHRlcn19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtZGF0ZS1yYW5nZS1pbnB1dFxuICAgICAgICAgIFtmb3JtR3JvdXBdPVwiY2FtcGFpZ25PbmVcIlxuICAgICAgICAgIFtyYW5nZVBpY2tlcl09XCJjYW1wYWlnbk9uZVBpY2tlclwiXG4gICAgICAgICAgW2NvbXBhcmlzb25TdGFydF09XCJjYW1wYWlnblR3by52YWx1ZS5zdGFydFwiXG4gICAgICAgICAgW2NvbXBhcmlzb25FbmRdPVwiY2FtcGFpZ25Ud28udmFsdWUuZW5kXCI+XG4gICAgICAgICAgPGlucHV0ICBtYXRTdGFydERhdGUgcGxhY2Vob2xkZXI9XCJTdGFydCBkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnRcIj5cbiAgICAgICAgICA8aW5wdXQgKGRhdGVJbnB1dCk9XCJzZWxlY3RGaWx0ZXJEYXRhKCRldmVudCwgaXRlbSlcIiBtYXRFbmREYXRlIHBsYWNlaG9sZGVyPVwiRW5kIGRhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJlbmRcIj5cbiAgICAgICAgPC9tYXQtZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJjYW1wYWlnbk9uZVBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICA8bWF0LWRhdGUtcmFuZ2UtcGlja2VyICNjYW1wYWlnbk9uZVBpY2tlcj48L21hdC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLTJcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiIChjbGljayk9XCJkZWx0ZUZpbHRlcihpdGVtKVwiPjxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPjwvZGl2PlxuXG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=