dts-backoffice-util 18.3.0 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/fesm2022/dts-backoffice-util.mjs +44 -43
- package/fesm2022/dts-backoffice-util.mjs.map +1 -1
- package/package.json +4 -6
- package/esm2022/dts-backoffice-util.mjs +0 -5
- package/esm2022/lib/components/totvs-map/totvs-map.component.mjs +0 -97
- package/esm2022/lib/components/totvs-schedule-execution/totvs-schedule-execution.component.mjs +0 -305
- package/esm2022/lib/components/totvs-schedule-execution/totvs-schedule-execution.model.mjs +0 -7
- package/esm2022/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.mjs +0 -208
- package/esm2022/lib/dts-backoffice-util.module.mjs +0 -57
- package/esm2022/lib/interfaces/filter-range.interface.mjs +0 -2
- package/esm2022/lib/interfaces/totvs-response.interface.mjs +0 -2
- package/esm2022/lib/model/session-info.model.mjs +0 -67
- package/esm2022/lib/pipes/dts-date-format.pipe.mjs +0 -20
- package/esm2022/lib/services/breadcrumb-control.service.mjs +0 -99
- package/esm2022/lib/services/cache-params.service.mjs +0 -25
- package/esm2022/lib/services/menu-datasul.service.mjs +0 -118
- package/esm2022/lib/services/profile.service.mjs +0 -55
- package/esm2022/lib/services/report.service.mjs +0 -57
- package/esm2022/lib/services/session-info.service.mjs +0 -36
- package/esm2022/lib/services/translate.service.mjs +0 -23
- package/esm2022/lib/services/validate.service.mjs +0 -42
- package/esm2022/lib/utils/date.util.mjs +0 -56
- package/esm2022/lib/utils/disclaimer.util.mjs +0 -490
- package/esm2022/lib/utils/field-validation.util.mjs +0 -179
- package/esm2022/lib/utils/file.util.mjs +0 -151
- package/esm2022/lib/utils/filter-range.util.mjs +0 -33
- package/esm2022/lib/utils/generic-functions.utils.mjs +0 -170
- package/esm2022/public-api.mjs +0 -40
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Versão: 1.002
|
|
3
|
-
Data Criação: 19/02/2019
|
|
4
|
-
*/
|
|
5
|
-
import { DisclaimerUtil } from './disclaimer.util';
|
|
6
|
-
export class FieldValidationUtil {
|
|
7
|
-
constructor(poNotification, poI18nPipe, literals) {
|
|
8
|
-
this.literals = {};
|
|
9
|
-
this.poNotification = poNotification;
|
|
10
|
-
this.poI18nPipe = poI18nPipe;
|
|
11
|
-
this.literals = literals;
|
|
12
|
-
this.disclaimerUtil = new DisclaimerUtil(this.poNotification, this.poI18nPipe, this.literals);
|
|
13
|
-
}
|
|
14
|
-
vldFieldCharacter(field, value) {
|
|
15
|
-
if (!value || value.trim() === '') {
|
|
16
|
-
this.poNotification.error({
|
|
17
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldRequered'], [this.literals[field]])
|
|
18
|
-
});
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
// Valida uma faixa de caracteres se o inicial é menor que final
|
|
24
|
-
vldRangeCharacter(initialField, finalField, initialValue, finalValue) {
|
|
25
|
-
if (!initialValue || !finalValue) {
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
if (initialValue.trim().toUpperCase() > finalValue.trim().toUpperCase()) {
|
|
29
|
-
this.poNotification.error({
|
|
30
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldRange'], [this.literals[initialField], this.literals[finalField]])
|
|
31
|
-
});
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
vldFieldNumber(field, value, vldValue = false, zeroAccept = false) {
|
|
37
|
-
if (vldValue && !this.vldValueOfNumber(field, value)) {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
if ((!value) || value <= 0) {
|
|
41
|
-
if (value === 0 && zeroAccept === true) {
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
this.poNotification.error({
|
|
45
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldRequered'], [this.literals[field]])
|
|
46
|
-
});
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
vldValueOfNumber(field, value) {
|
|
52
|
-
if (value && value < 0) {
|
|
53
|
-
this.poNotification.error({ message: this.poI18nPipe.transform(this.literals['fieldVldNumber'], [value.toString(), this.literals[field]]) });
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
vldFieldPercent(field, value, vldValue = false) {
|
|
59
|
-
if (vldValue && !this.vldValueOfPercent(field, value)) {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
if (!this.vldFieldNumber(field, value)) {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
vldValueOfPercent(field, value) {
|
|
68
|
-
if (value && value < 0) {
|
|
69
|
-
this.poNotification.error({ message: this.poI18nPipe.transform(this.literals['fieldVldNumber'], [value.toString(), this.literals[field]]) });
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
if (value && value > 100) {
|
|
73
|
-
this.poNotification.error({ message: this.poI18nPipe.transform(this.literals['fieldVldNumber'], [value.toString(), this.literals[field]]) });
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
// Valida uma faixa de números se o inicial é menor que final
|
|
79
|
-
vldRangeNumber(initialField, finalField, initialValue, finalValue) {
|
|
80
|
-
if (!initialValue) {
|
|
81
|
-
initialValue = 0;
|
|
82
|
-
}
|
|
83
|
-
if (!finalValue) {
|
|
84
|
-
finalValue = 0;
|
|
85
|
-
}
|
|
86
|
-
if (initialValue > finalValue) {
|
|
87
|
-
this.poNotification.error({
|
|
88
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldRange'], [this.literals[initialField], this.literals[finalField]])
|
|
89
|
-
});
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
vldFieldDate(field, value) {
|
|
95
|
-
const valDate = this.disclaimerUtil.ajustDate(value);
|
|
96
|
-
if (!this.disclaimerUtil.isValidDate(valDate)) {
|
|
97
|
-
this.poNotification.error({
|
|
98
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldDate'], [this.literals[field]])
|
|
99
|
-
});
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
// Valida uma faixa de datas se o inicial é menor que final
|
|
105
|
-
vldRangeDate(initialField, finalField, initialValue, finalValue) {
|
|
106
|
-
if (!initialValue || !finalValue) {
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
const valInitialDate = this.disclaimerUtil.ajustDate(initialValue).getTime();
|
|
110
|
-
const valFinalDate = this.disclaimerUtil.ajustDate(finalValue).getTime();
|
|
111
|
-
if (valInitialDate > valFinalDate) {
|
|
112
|
-
this.poNotification.error({
|
|
113
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldRange'], [this.literals[initialField], this.literals[finalField]])
|
|
114
|
-
});
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
vldFieldMultiSelect(field, value) {
|
|
120
|
-
if (!value || value.length === 0) {
|
|
121
|
-
this.poNotification.error({
|
|
122
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldSelected'], [this.literals[field]])
|
|
123
|
-
});
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
return true;
|
|
127
|
-
}
|
|
128
|
-
vldFieldCheckbox(field, value) {
|
|
129
|
-
if (!value || value.length === 0) {
|
|
130
|
-
this.poNotification.error({
|
|
131
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldSelected'], [this.literals[field]])
|
|
132
|
-
});
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
// Valida formato conforme regra: "9" apenas números, "X" qualquer caracter, "!" apenas letras maiúsculas
|
|
138
|
-
vldFieldFormat(field, value, format, replacePoint = false) {
|
|
139
|
-
let lOK = true;
|
|
140
|
-
let oldFormat;
|
|
141
|
-
if (!value) {
|
|
142
|
-
return lOK;
|
|
143
|
-
}
|
|
144
|
-
/*Retira os pontos do formato*/
|
|
145
|
-
if (replacePoint) {
|
|
146
|
-
oldFormat = format;
|
|
147
|
-
format = format.replace(/\./g, '');
|
|
148
|
-
}
|
|
149
|
-
if (value.length !== format.length) {
|
|
150
|
-
lOK = false;
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
for (let idx = 0; idx < format.length; idx++) {
|
|
154
|
-
if (format[idx] === '9') {
|
|
155
|
-
if (value[idx].replace(/[0-9]/, '9') !== '9') {
|
|
156
|
-
lOK = false;
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
if (format[idx] === '!') {
|
|
161
|
-
if (value[idx].replace(/[A-Z]/, 'A') !== 'A') {
|
|
162
|
-
lOK = false;
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
if (replacePoint) {
|
|
169
|
-
format = oldFormat;
|
|
170
|
-
}
|
|
171
|
-
if (!lOK) {
|
|
172
|
-
this.poNotification.error({
|
|
173
|
-
message: this.poI18nPipe.transform(this.literals['fieldVldFormat'], [this.literals[field], format])
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
return lOK;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtdmFsaWRhdGlvbi51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHRzLWJhY2tvZmZpY2UtdXRpbC9zcmMvbGliL3V0aWxzL2ZpZWxkLXZhbGlkYXRpb24udXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0VBR0U7QUFHRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsTUFBTSxPQUFPLG1CQUFtQjtJQU81QixZQUNJLGNBQXFDLEVBQ3JDLFVBQXNCLEVBQ3RCLFFBQWdCO1FBUHBCLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFTZixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQ2pELElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2dCQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ2hHLENBQUMsQ0FBQztZQUNILE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsZ0VB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LEdBQUcsR0FBRyxLQUFLLENBQUM7d0JBQUMsTUFBTTtvQkFBQyxDQUFDO2dCQUN6RSxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2YsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN2QixDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7Z0JBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3RHLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcblZlcnPDo286IDEuMDAyXHJcbkRhdGEgQ3JpYcOnw6NvOiAxOS8wMi8yMDE5XHJcbiovXHJcblxyXG5pbXBvcnQgeyBQb05vdGlmaWNhdGlvblNlcnZpY2UsIFBvSTE4blBpcGUgfSBmcm9tICdAcG8tdWkvbmctY29tcG9uZW50cyc7XHJcbmltcG9ydCB7IERpc2NsYWltZXJVdGlsIH0gZnJvbSAnLi9kaXNjbGFpbWVyLnV0aWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpZWxkVmFsaWRhdGlvblV0aWwge1xyXG4gICAgcG9Ob3RpZmljYXRpb246IFBvTm90aWZpY2F0aW9uU2VydmljZTtcclxuICAgIHBvSTE4blBpcGU6IFBvSTE4blBpcGU7XHJcbiAgICBsaXRlcmFsczogYW55ID0ge307XHJcblxyXG4gICAgZGlzY2xhaW1lclV0aWw6IERpc2NsYWltZXJVdGlsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHBvTm90aWZpY2F0aW9uOiBQb05vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcG9JMThuUGlwZTogUG9JMThuUGlwZSxcclxuICAgICAgICBsaXRlcmFsczogT2JqZWN0XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uID0gcG9Ob3RpZmljYXRpb247XHJcbiAgICAgICAgdGhpcy5wb0kxOG5QaXBlID0gcG9JMThuUGlwZTtcclxuICAgICAgICB0aGlzLmxpdGVyYWxzID0gbGl0ZXJhbHM7XHJcbiAgICAgICAgdGhpcy5kaXNjbGFpbWVyVXRpbCA9IG5ldyBEaXNjbGFpbWVyVXRpbCh0aGlzLnBvTm90aWZpY2F0aW9uLCB0aGlzLnBvSTE4blBpcGUsIHRoaXMubGl0ZXJhbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2bGRGaWVsZENoYXJhY3RlcihmaWVsZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3Ioe1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wb0kxOG5QaXBlLnRyYW5zZm9ybSh0aGlzLmxpdGVyYWxzWydmaWVsZFZsZFJlcXVlcmVkJ10sIFt0aGlzLmxpdGVyYWxzW2ZpZWxkXV0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFZhbGlkYSB1bWEgZmFpeGEgZGUgY2FyYWN0ZXJlcyBzZSBvIGluaWNpYWwgw6kgbWVub3IgcXVlIGZpbmFsXHJcbiAgICBwdWJsaWMgdmxkUmFuZ2VDaGFyYWN0ZXIoaW5pdGlhbEZpZWxkOiBzdHJpbmcsIGZpbmFsRmllbGQ6IHN0cmluZywgaW5pdGlhbFZhbHVlOiBzdHJpbmcsIGZpbmFsVmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghaW5pdGlhbFZhbHVlIHx8ICFmaW5hbFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZS50cmltKCkudG9VcHBlckNhc2UoKSA+IGZpbmFsVmFsdWUudHJpbSgpLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcih7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkUmFuZ2UnXSxcclxuICAgICAgICAgICAgICAgICAgICBbdGhpcy5saXRlcmFsc1tpbml0aWFsRmllbGRdLCB0aGlzLmxpdGVyYWxzW2ZpbmFsRmllbGRdXSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZsZEZpZWxkTnVtYmVyKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIsIHZsZFZhbHVlID0gZmFsc2UsIHplcm9BY2NlcHQgPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh2bGRWYWx1ZSAmJiAhdGhpcy52bGRWYWx1ZU9mTnVtYmVyKGZpZWxkLCB2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCghdmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwICYmIHplcm9BY2NlcHQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGRSZXF1ZXJlZCddLCBbdGhpcy5saXRlcmFsc1tmaWVsZF1dKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmxkVmFsdWVPZk51bWJlcihmaWVsZDogc3RyaW5nLCB2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgeyBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkTnVtYmVyJ10sIFt2YWx1ZS50b1N0cmluZygpLCB0aGlzLmxpdGVyYWxzW2ZpZWxkXV0pIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2bGRGaWVsZFBlcmNlbnQoZmllbGQ6IHN0cmluZywgdmFsdWU6IG51bWJlciwgdmxkVmFsdWUgPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh2bGRWYWx1ZSAmJiAhdGhpcy52bGRWYWx1ZU9mUGVyY2VudChmaWVsZCwgdmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy52bGRGaWVsZE51bWJlcihmaWVsZCwgdmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZsZFZhbHVlT2ZQZXJjZW50KGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3IoXHJcbiAgICAgICAgICAgICAgICB7IG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGROdW1iZXInXSwgW3ZhbHVlLnRvU3RyaW5nKCksIHRoaXMubGl0ZXJhbHNbZmllbGRdXSkgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSA+IDEwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgeyBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkTnVtYmVyJ10sIFt2YWx1ZS50b1N0cmluZygpLCB0aGlzLmxpdGVyYWxzW2ZpZWxkXV0pIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFZhbGlkYSB1bWEgZmFpeGEgZGUgbsO6bWVyb3Mgc2UgbyBpbmljaWFsIMOpIG1lbm9yIHF1ZSBmaW5hbFxyXG4gICAgcHVibGljIHZsZFJhbmdlTnVtYmVyKGluaXRpYWxGaWVsZDogc3RyaW5nLCBmaW5hbEZpZWxkOiBzdHJpbmcsIGluaXRpYWxWYWx1ZTogbnVtYmVyLCBmaW5hbFZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWluaXRpYWxWYWx1ZSkgeyBpbml0aWFsVmFsdWUgPSAwOyB9XHJcbiAgICAgICAgaWYgKCFmaW5hbFZhbHVlKSB7IGZpbmFsVmFsdWUgPSAwOyB9XHJcblxyXG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgPiBmaW5hbFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3Ioe1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wb0kxOG5QaXBlLnRyYW5zZm9ybSh0aGlzLmxpdGVyYWxzWydmaWVsZFZsZFJhbmdlJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMubGl0ZXJhbHNbaW5pdGlhbEZpZWxkXSwgdGhpcy5saXRlcmFsc1tmaW5hbEZpZWxkXV0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2bGRGaWVsZERhdGUoZmllbGQ6IHN0cmluZywgdmFsdWU6IERhdGUpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCB2YWxEYXRlID0gdGhpcy5kaXNjbGFpbWVyVXRpbC5hanVzdERhdGUodmFsdWUpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZGlzY2xhaW1lclV0aWwuaXNWYWxpZERhdGUodmFsRGF0ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcih7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkRGF0ZSddLCBbdGhpcy5saXRlcmFsc1tmaWVsZF1dKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBWYWxpZGEgdW1hIGZhaXhhIGRlIGRhdGFzIHNlIG8gaW5pY2lhbCDDqSBtZW5vciBxdWUgZmluYWxcclxuICAgIHB1YmxpYyB2bGRSYW5nZURhdGUoaW5pdGlhbEZpZWxkOiBzdHJpbmcsIGZpbmFsRmllbGQ6IHN0cmluZywgaW5pdGlhbFZhbHVlOiBEYXRlLCBmaW5hbFZhbHVlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFpbml0aWFsVmFsdWUgfHwgIWZpbmFsVmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2YWxJbml0aWFsRGF0ZSA9IHRoaXMuZGlzY2xhaW1lclV0aWwuYWp1c3REYXRlKGluaXRpYWxWYWx1ZSkuZ2V0VGltZSgpO1xyXG4gICAgICAgIGNvbnN0IHZhbEZpbmFsRGF0ZSA9IHRoaXMuZGlzY2xhaW1lclV0aWwuYWp1c3REYXRlKGZpbmFsVmFsdWUpLmdldFRpbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHZhbEluaXRpYWxEYXRlID4gdmFsRmluYWxEYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3Ioe1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wb0kxOG5QaXBlLnRyYW5zZm9ybSh0aGlzLmxpdGVyYWxzWydmaWVsZFZsZFJhbmdlJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMubGl0ZXJhbHNbaW5pdGlhbEZpZWxkXSwgdGhpcy5saXRlcmFsc1tmaW5hbEZpZWxkXV0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2bGRGaWVsZE11bHRpU2VsZWN0KGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBBcnJheTxhbnk+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcih7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkU2VsZWN0ZWQnXSwgW3RoaXMubGl0ZXJhbHNbZmllbGRdXSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZsZEZpZWxkQ2hlY2tib3goZmllbGQ6IHN0cmluZywgdmFsdWU6IEFycmF5PHN0cmluZz4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGRTZWxlY3RlZCddLCBbdGhpcy5saXRlcmFsc1tmaWVsZF1dKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBWYWxpZGEgZm9ybWF0byBjb25mb3JtZSByZWdyYTogXCI5XCIgYXBlbmFzIG7Dum1lcm9zLCBcIlhcIiBxdWFscXVlciBjYXJhY3RlciwgXCIhXCIgYXBlbmFzIGxldHJhcyBtYWnDunNjdWxhc1xyXG4gICAgcHVibGljIHZsZEZpZWxkRm9ybWF0KGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nLCByZXBsYWNlUG9pbnQgPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBsT0sgPSB0cnVlO1xyXG4gICAgICAgIGxldCBvbGRGb3JtYXQ6IHN0cmluZztcclxuXHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gbE9LOyB9XHJcblxyXG4gICAgICAgIC8qUmV0aXJhIG9zIHBvbnRvcyBkbyBmb3JtYXRvKi9cclxuICAgICAgICBpZiAocmVwbGFjZVBvaW50KSB7XHJcbiAgICAgICAgICAgIG9sZEZvcm1hdCA9IGZvcm1hdDtcclxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoL1xcLi9nLCAnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSBmb3JtYXQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxPSyA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGZvcm1hdC5sZW5ndGg7IGlkeCsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybWF0W2lkeF0gPT09ICc5Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtpZHhdLnJlcGxhY2UoL1swLTldLywgJzknKSAhPT0gJzknKSB7IGxPSyA9IGZhbHNlOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtYXRbaWR4XSA9PT0gJyEnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlW2lkeF0ucmVwbGFjZSgvW0EtWl0vLCAnQScpICE9PSAnQScpIHsgbE9LID0gZmFsc2U7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXBsYWNlUG9pbnQpIHtcclxuICAgICAgICAgICAgZm9ybWF0ID0gb2xkRm9ybWF0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFsT0spIHtcclxuICAgICAgICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcih7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkRm9ybWF0J10sIFt0aGlzLmxpdGVyYWxzW2ZpZWxkXSwgZm9ybWF0XSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbE9LO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
export class FileUtil {
|
|
2
|
-
constructor() { }
|
|
3
|
-
static downloadFile(data, fileName, contentType, base64) {
|
|
4
|
-
base64 = (base64 === false) ? false : true;
|
|
5
|
-
const dataBlob = base64 ? this.b64toBlob(data, contentType) : data;
|
|
6
|
-
this.download(dataBlob, fileName);
|
|
7
|
-
}
|
|
8
|
-
static downloadData(data, dwldDataParam = null) {
|
|
9
|
-
if (!data) {
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
if (!dwldDataParam) {
|
|
13
|
-
dwldDataParam = new DownloadDataParams();
|
|
14
|
-
}
|
|
15
|
-
if (!dwldDataParam.fileName) {
|
|
16
|
-
dwldDataParam.fileName = 'data.csv';
|
|
17
|
-
}
|
|
18
|
-
if (!dwldDataParam.literals) {
|
|
19
|
-
dwldDataParam.literals = {};
|
|
20
|
-
}
|
|
21
|
-
if (!dwldDataParam.columnDelimiter) {
|
|
22
|
-
dwldDataParam.columnDelimiter = ';';
|
|
23
|
-
}
|
|
24
|
-
if (!dwldDataParam.columnList) {
|
|
25
|
-
dwldDataParam.columnList = [];
|
|
26
|
-
}
|
|
27
|
-
if (!dwldDataParam.columnExclude) {
|
|
28
|
-
dwldDataParam.columnExclude = [];
|
|
29
|
-
}
|
|
30
|
-
const datab64 = btoa(this.jsonToString(data, dwldDataParam));
|
|
31
|
-
this.downloadFile(datab64, dwldDataParam.fileName, 'text/csv');
|
|
32
|
-
}
|
|
33
|
-
static download(file, fileName) {
|
|
34
|
-
const binaryData = [file];
|
|
35
|
-
const downloadLink = document.createElement('a');
|
|
36
|
-
const urlDownload = window.URL.createObjectURL(new Blob(binaryData, { type: file.type }));
|
|
37
|
-
/* Verifica se é ie ou edge, pois o mesmo tem tratamento próprio para arquivos blob */
|
|
38
|
-
const nav = window.navigator;
|
|
39
|
-
if (nav && nav.msSaveOrOpenBlob) {
|
|
40
|
-
nav.msSaveOrOpenBlob(file, fileName);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
downloadLink.href = urlDownload;
|
|
44
|
-
downloadLink.setAttribute('download', fileName);
|
|
45
|
-
document.body.appendChild(downloadLink);
|
|
46
|
-
downloadLink.click();
|
|
47
|
-
window.URL.revokeObjectURL(urlDownload);
|
|
48
|
-
downloadLink.remove();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
static b64toBlob(b64Data, contentType, sliceSize) {
|
|
52
|
-
contentType = contentType || '';
|
|
53
|
-
sliceSize = sliceSize || 512;
|
|
54
|
-
const byteCharacters = atob(b64Data);
|
|
55
|
-
const byteArrays = [];
|
|
56
|
-
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
|
|
57
|
-
const slice = byteCharacters.slice(offset, offset + sliceSize);
|
|
58
|
-
const byteNumbers = new Array(slice.length);
|
|
59
|
-
for (let i = 0; i < slice.length; i++) {
|
|
60
|
-
byteNumbers[i] = slice.charCodeAt(i);
|
|
61
|
-
}
|
|
62
|
-
const byteArray = new Uint8Array(byteNumbers);
|
|
63
|
-
byteArrays.push(byteArray);
|
|
64
|
-
}
|
|
65
|
-
const blob = new Blob(byteArrays, { type: contentType });
|
|
66
|
-
return blob;
|
|
67
|
-
}
|
|
68
|
-
static jsonToString(jsonData, dwldDataParam) {
|
|
69
|
-
if (!jsonData || jsonData.length === 0) {
|
|
70
|
-
return '';
|
|
71
|
-
}
|
|
72
|
-
const lineDelimiter = '\n';
|
|
73
|
-
let columnOrig = null;
|
|
74
|
-
let columnHeader = null;
|
|
75
|
-
const keys = [];
|
|
76
|
-
let includeKey;
|
|
77
|
-
if (dwldDataParam.columnList &&
|
|
78
|
-
dwldDataParam.columnList.length > 0) {
|
|
79
|
-
columnOrig = dwldDataParam.columnList;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
columnOrig = Object.keys(jsonData[0]);
|
|
83
|
-
}
|
|
84
|
-
columnOrig.forEach(key => {
|
|
85
|
-
includeKey = true;
|
|
86
|
-
if (dwldDataParam.columnExclude &&
|
|
87
|
-
dwldDataParam.columnExclude.length > 0 &&
|
|
88
|
-
dwldDataParam.columnExclude.indexOf(key) !== -1) {
|
|
89
|
-
includeKey = false;
|
|
90
|
-
}
|
|
91
|
-
if (includeKey) {
|
|
92
|
-
keys.push(key);
|
|
93
|
-
columnHeader = (!columnHeader) ? '' : columnHeader + dwldDataParam.columnDelimiter;
|
|
94
|
-
columnHeader += (dwldDataParam.literals[key]) ? dwldDataParam.literals[key] : key;
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
const lineStr = jsonData.reduce((accLineStr, currentItem) => {
|
|
98
|
-
let first = true;
|
|
99
|
-
let columnValue = null;
|
|
100
|
-
keys.forEach(key => {
|
|
101
|
-
if (!first) {
|
|
102
|
-
accLineStr += dwldDataParam.columnDelimiter;
|
|
103
|
-
}
|
|
104
|
-
columnValue = currentItem[key];
|
|
105
|
-
if (columnValue === null || columnValue === undefined) {
|
|
106
|
-
columnValue = '';
|
|
107
|
-
}
|
|
108
|
-
switch (typeof (columnValue)) {
|
|
109
|
-
case 'number':
|
|
110
|
-
columnValue = columnValue.toLocaleString();
|
|
111
|
-
break;
|
|
112
|
-
case 'boolean':
|
|
113
|
-
columnValue = (dwldDataParam.literals[`${columnValue}`]) ?
|
|
114
|
-
dwldDataParam.literals[`${columnValue}`] : columnValue;
|
|
115
|
-
break;
|
|
116
|
-
case 'object':
|
|
117
|
-
columnValue = JSON.stringify(columnValue);
|
|
118
|
-
}
|
|
119
|
-
accLineStr += columnValue;
|
|
120
|
-
first = false;
|
|
121
|
-
});
|
|
122
|
-
return accLineStr + lineDelimiter;
|
|
123
|
-
}, columnHeader + lineDelimiter);
|
|
124
|
-
return lineStr;
|
|
125
|
-
}
|
|
126
|
-
static fileToB64(file) {
|
|
127
|
-
return new Promise((resolve, reject) => {
|
|
128
|
-
const reader = new FileReader();
|
|
129
|
-
reader.readAsDataURL(file);
|
|
130
|
-
reader.onload = () => {
|
|
131
|
-
let cntFile;
|
|
132
|
-
cntFile = reader.result;
|
|
133
|
-
if (!cntFile) {
|
|
134
|
-
reject('File not found or Empty');
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const aCnt = cntFile.split(',');
|
|
138
|
-
if (aCnt && aCnt.length >= 2) {
|
|
139
|
-
resolve(aCnt[1]);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
reject('File not found or Empty');
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
reader.onerror = error => reject(error);
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
export class DownloadDataParams {
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHRzLWJhY2tvZmZpY2UtdXRpbC9zcmMvbGliL3V0aWxzL2ZpbGUudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQUVqQixnQkFDSSxDQUFDO0lBRUwsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFTLEVBQUUsUUFBZ0IsRUFBRSxXQUFvQixFQUFFLE1BQWdCO1FBQ25GLE1BQU0sR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQWdCLEVBQUUsZ0JBQXFDLElBQUk7UUFDM0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFFdEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQUMsYUFBYSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENB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T0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBVUQsTUFBTSxPQUFPLGtCQUFrQjtDQU05QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBGaWxlVXRpbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICApIHsgfVxyXG5cclxuICAgIHN0YXRpYyBkb3dubG9hZEZpbGUoZGF0YTogYW55LCBmaWxlTmFtZTogc3RyaW5nLCBjb250ZW50VHlwZT86IHN0cmluZywgYmFzZTY0PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGJhc2U2NCA9IChiYXNlNjQgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgICAgICBjb25zdCBkYXRhQmxvYiA9IGJhc2U2NCA/IHRoaXMuYjY0dG9CbG9iKGRhdGEsIGNvbnRlbnRUeXBlKSA6IGRhdGE7XHJcbiAgICAgICAgdGhpcy5kb3dubG9hZChkYXRhQmxvYiwgZmlsZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBkb3dubG9hZERhdGEoZGF0YTogQXJyYXk8YW55PiwgZHdsZERhdGFQYXJhbTogSURvd25sb2FkRGF0YVBhcmFtcyA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRhdGEpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGlmICghZHdsZERhdGFQYXJhbSkgeyBkd2xkRGF0YVBhcmFtID0gbmV3IERvd25sb2FkRGF0YVBhcmFtcygpOyB9XHJcbiAgICAgICAgaWYgKCFkd2xkRGF0YVBhcmFtLmZpbGVOYW1lKSB7IGR3bGREYXRhUGFyYW0uZmlsZU5hbWUgPSAnZGF0YS5jc3YnOyB9XHJcbiAgICAgICAgaWYgKCFkd2xkRGF0YVBhcmFtLmxpdGVyYWxzKSB7IGR3bGREYXRhUGFyYW0ubGl0ZXJhbHMgPSB7fTsgfVxyXG4gICAgICAgIGlmICghZHdsZERhdGFQYXJhbS5jb2x1bW5EZWxpbWl0ZXIpIHsgZHdsZERhdGFQYXJhbS5jb2x1bW5EZWxpbWl0ZXIgPSAnOyc7IH1cclxuICAgICAgICBpZiAoIWR3bGREYXRhUGFyYW0uY29sdW1uTGlzdCkgeyBkd2xkRGF0YVBhcmFtLmNvbHVtbkxpc3QgPSBbXTsgfVxyXG4gICAgICAgIGlmICghZHdsZERhdGFQYXJhbS5jb2x1bW5FeGNsdWRlKSB7IGR3bGREYXRhUGFyYW0uY29sdW1uRXhjbHVkZSA9IFtdOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGFiNjQgPSBidG9hKHRoaXMuanNvblRvU3RyaW5nKGRhdGEsIGR3bGREYXRhUGFyYW0pKTtcclxuICAgICAgICB0aGlzLmRvd25sb2FkRmlsZShkYXRhYjY0LCBkd2xkRGF0YVBhcmFtLmZpbGVOYW1lLCAndGV4dC9jc3YnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBkb3dubG9hZChmaWxlOiBCbG9iLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYmluYXJ5RGF0YSA9IFtmaWxlXTtcclxuICAgICAgICBjb25zdCBkb3dubG9hZExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgY29uc3QgdXJsRG93bmxvYWQgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihiaW5hcnlEYXRhLCB7IHR5cGU6IGZpbGUudHlwZSB9KSk7XHJcblxyXG4gICAgICAgIC8qIFZlcmlmaWNhIHNlIMOpIGllIG91IGVkZ2UsIHBvaXMgbyBtZXNtbyB0ZW0gdHJhdGFtZW50byBwcsOzcHJpbyBwYXJhIGFycXVpdm9zIGJsb2IgKi9cclxuICAgICAgICBjb25zdCBuYXYgPSAod2luZG93Lm5hdmlnYXRvciBhcyBhbnkpO1xyXG4gICAgICAgIGlmIChuYXYgJiYgbmF2Lm1zU2F2ZU9yT3BlbkJsb2IpIHtcclxuICAgICAgICAgICAgbmF2Lm1zU2F2ZU9yT3BlbkJsb2IoZmlsZSwgZmlsZU5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRvd25sb2FkTGluay5ocmVmID0gdXJsRG93bmxvYWQ7XHJcbiAgICAgICAgICAgIGRvd25sb2FkTGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZmlsZU5hbWUpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvd25sb2FkTGluayk7XHJcbiAgICAgICAgICAgIGRvd25sb2FkTGluay5jbGljaygpO1xyXG4gICAgICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmxEb3dubG9hZCk7XHJcbiAgICAgICAgICAgIGRvd25sb2FkTGluay5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGI2NHRvQmxvYihiNjREYXRhOiBhbnksIGNvbnRlbnRUeXBlPzogc3RyaW5nLCBzbGljZVNpemU/OiBudW1iZXIpOiBCbG9iIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlIHx8ICcnO1xyXG4gICAgICAgIHNsaWNlU2l6ZSA9IHNsaWNlU2l6ZSB8fCA1MTI7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTtcclxuICAgICAgICBjb25zdCBieXRlQXJyYXlzID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBzbGljZSA9IGJ5dGVDaGFyYWN0ZXJzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2xpY2VTaXplKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KHNsaWNlLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGJ5dGVOdW1iZXJzW2ldID0gc2xpY2UuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xyXG4gICAgICAgICAgICBieXRlQXJyYXlzLnB1c2goYnl0ZUFycmF5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihieXRlQXJyYXlzLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xyXG4gICAgICAgIHJldHVybiBibG9iO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGpzb25Ub1N0cmluZyhqc29uRGF0YTogQXJyYXk8YW55PiwgZHdsZERhdGFQYXJhbTogSURvd25sb2FkRGF0YVBhcmFtcyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCFqc29uRGF0YSB8fCBqc29uRGF0YS5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmVEZWxpbWl0ZXIgPSAnXFxuJztcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbk9yaWcgPSBudWxsO1xyXG4gICAgICAgIGxldCBjb2x1bW5IZWFkZXIgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBbXTtcclxuICAgICAgICBsZXQgaW5jbHVkZUtleTogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgaWYgKGR3bGREYXRhUGFyYW0uY29sdW1uTGlzdCAmJlxyXG4gICAgICAgICAgICBkd2xkRGF0YVBhcmFtLmNvbHVtbkxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb2x1bW5PcmlnID0gZHdsZERhdGFQYXJhbS5jb2x1bW5MaXN0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbHVtbk9yaWcgPSBPYmplY3Qua2V5cyhqc29uRGF0YVswXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb2x1bW5PcmlnLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgaW5jbHVkZUtleSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoZHdsZERhdGFQYXJhbS5jb2x1bW5FeGNsdWRlICYmXHJcbiAgICAgICAgICAgICAgICBkd2xkRGF0YVBhcmFtLmNvbHVtbkV4Y2x1ZGUubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgZHdsZERhdGFQYXJhbS5jb2x1bW5FeGNsdWRlLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGluY2x1ZGVLZXkgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGluY2x1ZGVLZXkpIHtcclxuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uSGVhZGVyID0gKCFjb2x1bW5IZWFkZXIpID8gJycgOiBjb2x1bW5IZWFkZXIgKyBkd2xkRGF0YVBhcmFtLmNvbHVtbkRlbGltaXRlcjtcclxuICAgICAgICAgICAgICAgIGNvbHVtbkhlYWRlciArPSAoZHdsZERhdGFQYXJhbS5saXRlcmFsc1trZXldKSA/IGR3bGREYXRhUGFyYW0ubGl0ZXJhbHNba2V5XSA6IGtleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBsaW5lU3RyID0ganNvbkRhdGEucmVkdWNlKChhY2NMaW5lU3RyLCBjdXJyZW50SXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgY29sdW1uVmFsdWUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7IGFjY0xpbmVTdHIgKz0gZHdsZERhdGFQYXJhbS5jb2x1bW5EZWxpbWl0ZXI7IH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5WYWx1ZSA9IGN1cnJlbnRJdGVtW2tleV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uVmFsdWUgPT09IG51bGwgfHwgY29sdW1uVmFsdWUgPT09IHVuZGVmaW5lZCkgeyBjb2x1bW5WYWx1ZSA9ICcnOyB9XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiAoY29sdW1uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSBjb2x1bW5WYWx1ZS50b0xvY2FsZVN0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSAoZHdsZERhdGFQYXJhbS5saXRlcmFsc1tgJHtjb2x1bW5WYWx1ZX1gXSkgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdsZERhdGFQYXJhbS5saXRlcmFsc1tgJHtjb2x1bW5WYWx1ZX1gXSA6IGNvbHVtblZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5WYWx1ZSA9IEpTT04uc3RyaW5naWZ5KGNvbHVtblZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGFjY0xpbmVTdHIgKz0gY29sdW1uVmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYWNjTGluZVN0ciArIGxpbmVEZWxpbWl0ZXI7XHJcblxyXG4gICAgICAgIH0sIGNvbHVtbkhlYWRlciArIGxpbmVEZWxpbWl0ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbGluZVN0cjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZmlsZVRvQjY0KGZpbGU6IEZpbGUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuXHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY250RmlsZTogYW55O1xyXG4gICAgICAgICAgICAgICAgY250RmlsZSA9IHJlYWRlci5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNudEZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0ZpbGUgbm90IGZvdW5kIG9yIEVtcHR5Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGFDbnQgPSBjbnRGaWxlLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYUNudCAmJiBhQ250Lmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhQ250WzFdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdGaWxlIG5vdCBmb3VuZCBvciBFbXB0eScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJRG93bmxvYWREYXRhUGFyYW1zIHtcclxuICAgIGZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgICBsaXRlcmFsczogYW55O1xyXG4gICAgY29sdW1uRGVsaW1pdGVyOiBzdHJpbmc7XHJcbiAgICBjb2x1bW5MaXN0OiBBcnJheTxzdHJpbmc+O1xyXG4gICAgY29sdW1uRXhjbHVkZTogQXJyYXk8c3RyaW5nPjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERvd25sb2FkRGF0YVBhcmFtcyBpbXBsZW1lbnRzIElEb3dubG9hZERhdGFQYXJhbXMge1xyXG4gICAgZmlsZU5hbWU6IHN0cmluZztcclxuICAgIGxpdGVyYWxzOiBhbnk7XHJcbiAgICBjb2x1bW5EZWxpbWl0ZXI6IHN0cmluZztcclxuICAgIGNvbHVtbkxpc3Q6IEFycmF5PHN0cmluZz47XHJcbiAgICBjb2x1bW5FeGNsdWRlOiBBcnJheTxzdHJpbmc+O1xyXG59XHJcbiJdfQ==
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Versão: 1.000
|
|
3
|
-
Data Criação: 06/08/2018
|
|
4
|
-
*/
|
|
5
|
-
export class FilterRangeUtil {
|
|
6
|
-
constructor() {
|
|
7
|
-
}
|
|
8
|
-
static makeFilterRangeCharacter(iniInitial, iniFinal) {
|
|
9
|
-
return {
|
|
10
|
-
iniInitial,
|
|
11
|
-
iniFinal,
|
|
12
|
-
valInitial: iniInitial,
|
|
13
|
-
valFinal: iniFinal
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
static makeFilterRangeNumber(iniInitial, iniFinal) {
|
|
17
|
-
return {
|
|
18
|
-
iniInitial,
|
|
19
|
-
iniFinal,
|
|
20
|
-
valInitial: iniInitial,
|
|
21
|
-
valFinal: iniFinal
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
static makeFilterRangeDate(iniInitial, iniFinal) {
|
|
25
|
-
return {
|
|
26
|
-
iniInitial,
|
|
27
|
-
iniFinal,
|
|
28
|
-
valInitial: iniInitial,
|
|
29
|
-
valFinal: iniFinal
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXJhbmdlLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdHMtYmFja29mZmljZS11dGlsL3NyYy9saWIvdXRpbHMvZmlsdGVyLXJhbmdlLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztFQUdFO0FBSUYsTUFBTSxPQUFPLGVBQWU7SUFFeEI7SUFDQSxDQUFDO0lBRU0sTUFBTSxDQUFDLHdCQUF3QixDQUFDLFVBQWtCLEVBQUUsUUFBZ0I7UUFDdkUsT0FBTztZQUNILFVBQVU7WUFDVixRQUFRO1lBQ1IsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLFFBQVE7U0FDckIsQ0FBQztJQUNOLENBQUM7SUFFTSxNQUFNLENBQUMscUJBQXFCLENBQUMsVUFBa0IsRUFBRSxRQUFnQjtRQUNwRSxPQUFPO1lBQ0gsVUFBVTtZQUNWLFFBQVE7WUFDUixVQUFVLEVBQUUsVUFBVTtZQUN0QixRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDO0lBQ04sQ0FBQztJQUVNLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxVQUFnQixFQUFFLFFBQWM7UUFDOUQsT0FBTztZQUNILFVBQVU7WUFDVixRQUFRO1lBQ1IsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLFFBQVE7U0FDckIsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcblZlcnPDo286IDEuMDAwXHJcbkRhdGEgQ3JpYcOnw6NvOiAwNi8wOC8yMDE4XHJcbiovXHJcblxyXG5pbXBvcnQgeyBJRmlsdGVyUmFuZ2VDaGFyYWN0ZXIsIElGaWx0ZXJSYW5nZU51bWJlciwgSUZpbHRlclJhbmdlRGF0ZSB9IGZyb20gJy4uLy4uL2xpYi9pbnRlcmZhY2VzL2ZpbHRlci1yYW5nZS5pbnRlcmZhY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbHRlclJhbmdlVXRpbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBtYWtlRmlsdGVyUmFuZ2VDaGFyYWN0ZXIoaW5pSW5pdGlhbDogc3RyaW5nLCBpbmlGaW5hbDogc3RyaW5nKTogSUZpbHRlclJhbmdlQ2hhcmFjdGVyIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpbmlJbml0aWFsLFxyXG4gICAgICAgICAgICBpbmlGaW5hbCxcclxuICAgICAgICAgICAgdmFsSW5pdGlhbDogaW5pSW5pdGlhbCxcclxuICAgICAgICAgICAgdmFsRmluYWw6IGluaUZpbmFsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIG1ha2VGaWx0ZXJSYW5nZU51bWJlcihpbmlJbml0aWFsOiBudW1iZXIsIGluaUZpbmFsOiBudW1iZXIpOiBJRmlsdGVyUmFuZ2VOdW1iZXIge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGluaUluaXRpYWwsXHJcbiAgICAgICAgICAgIGluaUZpbmFsLFxyXG4gICAgICAgICAgICB2YWxJbml0aWFsOiBpbmlJbml0aWFsLFxyXG4gICAgICAgICAgICB2YWxGaW5hbDogaW5pRmluYWxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgbWFrZUZpbHRlclJhbmdlRGF0ZShpbmlJbml0aWFsOiBEYXRlLCBpbmlGaW5hbDogRGF0ZSk6IElGaWx0ZXJSYW5nZURhdGUge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGluaUluaXRpYWwsXHJcbiAgICAgICAgICAgIGluaUZpbmFsLFxyXG4gICAgICAgICAgICB2YWxJbml0aWFsOiBpbmlJbml0aWFsLFxyXG4gICAgICAgICAgICB2YWxGaW5hbDogaW5pRmluYWxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Versão: 1.003
|
|
3
|
-
Data Criação: 18/04/2019
|
|
4
|
-
*/
|
|
5
|
-
export class GenericFunctionsUtils {
|
|
6
|
-
constructor(literals) {
|
|
7
|
-
this.literals = {};
|
|
8
|
-
this.literals = literals;
|
|
9
|
-
}
|
|
10
|
-
/* Transforma uma Lista separada por "," em um Array */
|
|
11
|
-
static listToArrayCharacter(list) {
|
|
12
|
-
let returnArray = new Array();
|
|
13
|
-
if (list && list !== '') {
|
|
14
|
-
returnArray = list.split(',');
|
|
15
|
-
}
|
|
16
|
-
return returnArray;
|
|
17
|
-
}
|
|
18
|
-
/* Transforma um Array em uma Lista separada por "," */
|
|
19
|
-
static ArrayToListCharacter(array) {
|
|
20
|
-
let list = '';
|
|
21
|
-
if (array && array.length > 0) {
|
|
22
|
-
list = array.join(',');
|
|
23
|
-
}
|
|
24
|
-
return list;
|
|
25
|
-
}
|
|
26
|
-
static isEmpty(object) {
|
|
27
|
-
let isEmpty = true;
|
|
28
|
-
for (const content in object) {
|
|
29
|
-
if (object.hasOwnProperty(content)) {
|
|
30
|
-
isEmpty = false;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return isEmpty;
|
|
34
|
-
}
|
|
35
|
-
static getChartValues(chartData) {
|
|
36
|
-
let chartValues;
|
|
37
|
-
let maxValue, minValue;
|
|
38
|
-
maxValue = undefined;
|
|
39
|
-
minValue = undefined;
|
|
40
|
-
chartData.map(item => {
|
|
41
|
-
if (maxValue === undefined && minValue === undefined) {
|
|
42
|
-
maxValue = item.data[0];
|
|
43
|
-
minValue = item.data[0];
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
if (item.data < minValue) {
|
|
47
|
-
minValue = item.data[0];
|
|
48
|
-
}
|
|
49
|
-
if (item.data > maxValue) {
|
|
50
|
-
maxValue = item.data[0];
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
if (maxValue > 0 && minValue > 0) {
|
|
55
|
-
chartValues = { maxValue: maxValue, minValue: 0 };
|
|
56
|
-
}
|
|
57
|
-
if (maxValue > 0 && minValue < 0) {
|
|
58
|
-
chartValues = { maxValue: maxValue, minValue: minValue };
|
|
59
|
-
}
|
|
60
|
-
if (maxValue < 0 && minValue < 0) {
|
|
61
|
-
const max = (minValue / 3) * (-1);
|
|
62
|
-
chartValues = { maxValue: max, minValue: minValue };
|
|
63
|
-
}
|
|
64
|
-
if (maxValue > 0 && minValue === 0) {
|
|
65
|
-
chartValues = { maxValue: maxValue, minValue: 0 };
|
|
66
|
-
}
|
|
67
|
-
if (maxValue === 0 && minValue < 0) {
|
|
68
|
-
const max = (minValue / 3) * (-1);
|
|
69
|
-
chartValues = { maxValue: max, minValue: minValue };
|
|
70
|
-
}
|
|
71
|
-
if (maxValue === 0 && minValue === 0) {
|
|
72
|
-
chartValues = { maxValue: undefined, minValue: undefined };
|
|
73
|
-
}
|
|
74
|
-
chartValues.maxValue = Math.round(chartValues.maxValue);
|
|
75
|
-
chartValues.minValue = Math.round(chartValues.minValue);
|
|
76
|
-
return chartValues;
|
|
77
|
-
}
|
|
78
|
-
/*Deixa no list apenas o itens que existem no options*/
|
|
79
|
-
static atzMultiSelectListByOptions(options, list) {
|
|
80
|
-
let idx;
|
|
81
|
-
let newList;
|
|
82
|
-
if (!list) {
|
|
83
|
-
return list;
|
|
84
|
-
}
|
|
85
|
-
newList = new Array();
|
|
86
|
-
list.map(item => {
|
|
87
|
-
if (item) {
|
|
88
|
-
idx = options.findIndex(itemOptions => itemOptions.value === item);
|
|
89
|
-
if (idx >= 0) {
|
|
90
|
-
newList.push(item);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
return newList;
|
|
95
|
-
}
|
|
96
|
-
/*Carrega o Options com os valores defaults passados como parâmetro (list)*/
|
|
97
|
-
loadOptionsMultiSelect(options, list) {
|
|
98
|
-
let idx;
|
|
99
|
-
if (!list) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
list.map(item => {
|
|
103
|
-
if (item) {
|
|
104
|
-
idx = options.findIndex(itemOptions => itemOptions.value === item);
|
|
105
|
-
if (idx === -1) {
|
|
106
|
-
options.push({ label: item === 'all' ? this.literals['all'] : item, value: item });
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
/*Carrega o Options com os valores defaults passados como parâmetro (list)*/
|
|
112
|
-
loadOptionsSelect(options, selectValue, tradValue = false) {
|
|
113
|
-
let idx;
|
|
114
|
-
if (!selectValue) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
if (selectValue) {
|
|
118
|
-
idx = options.findIndex(itemOptions => itemOptions.value === selectValue);
|
|
119
|
-
if (idx === -1) {
|
|
120
|
-
options.push({ label: tradValue ? this.literals[selectValue] : selectValue, value: selectValue });
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/*Método que compara 2 objetos e retorna se são iguais ou diferentes*/
|
|
125
|
-
compareObjects(firstObject, secondObject) {
|
|
126
|
-
if (!firstObject || !secondObject) {
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
/*Pega a lista de nomes dos campos do objetos e compara*/
|
|
130
|
-
if (Object.getOwnPropertyNames(firstObject).length !== Object.getOwnPropertyNames(secondObject).length) {
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
for (const content in firstObject) {
|
|
134
|
-
if (content.substr(0, 1) === '$' || content.substr(0, 1) === '_') {
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
if (firstObject[content] !== secondObject[content]) {
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
143
|
-
referenceGeneration(charInd, dateRef) {
|
|
144
|
-
let reference;
|
|
145
|
-
let random;
|
|
146
|
-
const iDay = dateRef.getDate();
|
|
147
|
-
const iMonth = dateRef.getMonth() + 1;
|
|
148
|
-
const iYear = dateRef.getFullYear();
|
|
149
|
-
reference = `${this.pad(iYear)}${this.pad(iMonth)}${this.pad(iDay)}${charInd}`;
|
|
150
|
-
random = btoa(`${(new Date()).getTime()}`);
|
|
151
|
-
random = random.replace(/[=]/g, '');
|
|
152
|
-
random = random.slice(random.length - 3, random.length);
|
|
153
|
-
return `${reference}${random}`;
|
|
154
|
-
}
|
|
155
|
-
pad(number) {
|
|
156
|
-
if (number < 10) {
|
|
157
|
-
return '0' + number;
|
|
158
|
-
}
|
|
159
|
-
if (number > 99) {
|
|
160
|
-
return (number + '').slice(2, 4);
|
|
161
|
-
}
|
|
162
|
-
return number;
|
|
163
|
-
}
|
|
164
|
-
focusInternalInput(idField) {
|
|
165
|
-
const fieldComponent = document.getElementById(idField);
|
|
166
|
-
const fieldInput = fieldComponent.getElementsByClassName('po-input')[0];
|
|
167
|
-
fieldInput.focus();
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1mdW5jdGlvbnMudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdHMtYmFja29mZmljZS11dGlsL3NyYy9saWIvdXRpbHMvZ2VuZXJpYy1mdW5jdGlvbnMudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztFQUdFO0FBYUYsTUFBTSxPQUFPLHFCQUFxQjtJQUk5QixZQUNJLFFBQWdCO1FBSHBCLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFLZixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUM3QixDQUFDO0lBRUQsdURBQXVEO0lBQ3ZELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFZO1FBQ3BDLElBQUksV0FBVyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFFdEMsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFvQjtRQUM1QyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFFZCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFjO1FBQ3pCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztRQUVuQixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENB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TUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXhELE9BQU8sR0FBRyxTQUFTLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLEdBQUcsQ0FBQyxNQUFNO1FBQ2IsSUFBSSxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDZCxPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU0sa0JBQWtCLENBQUMsT0FBZTtRQUNyQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUE4QixjQUFjLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcblZlcnPDo286IDEuMDAzXHJcbkRhdGEgQ3JpYcOnw6NvOiAxOC8wNC8yMDE5XHJcbiovXHJcblxyXG5pbXBvcnQgeyBQb011bHRpc2VsZWN0T3B0aW9uLCBQb1NlbGVjdE9wdGlvbiB9IGZyb20gJ0Bwby11aS9uZy1jb21wb25lbnRzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcnRTZXJpZXMge1xyXG4gICAgICBuYW1lPzogc3RyaW5nO1xyXG4gICAgICBkYXRhPzogQXJyYXk8bnVtYmVyPjtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0VmFsdWVzIHtcclxuICAgIG1pblZhbHVlOiBudW1iZXI7XHJcbiAgICBtYXhWYWx1ZTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR2VuZXJpY0Z1bmN0aW9uc1V0aWxzIHtcclxuXHJcbiAgICBsaXRlcmFsczogYW55ID0ge307XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgbGl0ZXJhbHM6IE9iamVjdFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5saXRlcmFscyA9IGxpdGVyYWxzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFRyYW5zZm9ybWEgdW1hIExpc3RhIHNlcGFyYWRhIHBvciBcIixcIiBlbSB1bSBBcnJheSAqL1xyXG4gICAgc3RhdGljIGxpc3RUb0FycmF5Q2hhcmFjdGVyKGxpc3Q6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgICAgIGxldCByZXR1cm5BcnJheSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG4gICAgICAgIGlmIChsaXN0ICYmIGxpc3QgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybkFycmF5ID0gbGlzdC5zcGxpdCgnLCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJldHVybkFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFRyYW5zZm9ybWEgdW0gQXJyYXkgZW0gdW1hIExpc3RhIHNlcGFyYWRhIHBvciBcIixcIiAgKi9cclxuICAgIHN0YXRpYyBBcnJheVRvTGlzdENoYXJhY3RlcihhcnJheTogQXJyYXk8c3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGxpc3QgPSAnJztcclxuXHJcbiAgICAgICAgaWYgKGFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGlzdCA9IGFycmF5LmpvaW4oJywnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0VtcHR5KG9iamVjdDogb2JqZWN0KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGlzRW1wdHkgPSB0cnVlO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRlbnQgaW4gb2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoY29udGVudCkpIHtcclxuICAgICAgICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlzRW1wdHk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldENoYXJ0VmFsdWVzKGNoYXJ0RGF0YTogQXJyYXk8Q2hhcnRTZXJpZXM+KTogQ2hhcnRWYWx1ZXMge1xyXG5cclxuICAgICAgICBsZXQgY2hhcnRWYWx1ZXM6IENoYXJ0VmFsdWVzO1xyXG5cclxuICAgICAgICBsZXQgbWF4VmFsdWUsXHJcbiAgICAgICAgICAgIG1pblZhbHVlO1xyXG5cclxuICAgICAgICBtYXhWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICBtaW5WYWx1ZSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgY2hhcnREYXRhLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKG1heFZhbHVlID09PSB1bmRlZmluZWQgJiYgbWluVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBpdGVtLmRhdGFbMF07XHJcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW0uZGF0YVswXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmRhdGEgPCBtaW5WYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1pblZhbHVlID0gaXRlbS5kYXRhWzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YSA+IG1heFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBpdGVtLmRhdGFbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKG1heFZhbHVlID4gMCAmJiBtaW5WYWx1ZSA+IDApIHtcclxuICAgICAgICAgICAgY2hhcnRWYWx1ZXMgPSB7IG1heFZhbHVlOiBtYXhWYWx1ZSwgbWluVmFsdWU6IDAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtYXhWYWx1ZSA+IDAgJiYgbWluVmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICAgIGNoYXJ0VmFsdWVzID0geyBtYXhWYWx1ZTogbWF4VmFsdWUsIG1pblZhbHVlOiBtaW5WYWx1ZSB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1heFZhbHVlIDwgMCAmJiBtaW5WYWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgY29uc3QgbWF4ID0gKG1pblZhbHVlIC8gMykgKiAoLSAxKTtcclxuICAgICAgICAgICAgY2hhcnRWYWx1ZXMgPSB7IG1heFZhbHVlOiBtYXgsIG1pblZhbHVlOiBtaW5WYWx1ZSB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1heFZhbHVlID4gMCAmJiBtaW5WYWx1ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICBjaGFydFZhbHVlcyA9IHsgbWF4VmFsdWU6IG1heFZhbHVlLCBtaW5WYWx1ZTogMCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1heFZhbHVlID09PSAwICYmIG1pblZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICBjb25zdCBtYXggPSAobWluVmFsdWUgLyAzKSAqICgtIDEpO1xyXG4gICAgICAgICAgICBjaGFydFZhbHVlcyA9IHsgbWF4VmFsdWU6IG1heCwgbWluVmFsdWU6IG1pblZhbHVlIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWF4VmFsdWUgPT09IDAgJiYgbWluVmFsdWUgPT09IDApIHtcclxuICAgICAgICAgICAgY2hhcnRWYWx1ZXMgPSB7IG1heFZhbHVlOiB1bmRlZmluZWQsIG1pblZhbHVlOiB1bmRlZmluZWQgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNoYXJ0VmFsdWVzLm1heFZhbHVlID0gTWF0aC5yb3VuZChjaGFydFZhbHVlcy5tYXhWYWx1ZSk7XHJcbiAgICAgICAgY2hhcnRWYWx1ZXMubWluVmFsdWUgPSBNYXRoLnJvdW5kKGNoYXJ0VmFsdWVzLm1pblZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNoYXJ0VmFsdWVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qRGVpeGEgbm8gbGlzdCBhcGVuYXMgbyBpdGVucyBxdWUgZXhpc3RlbSBubyBvcHRpb25zKi9cclxuICAgIHN0YXRpYyBhdHpNdWx0aVNlbGVjdExpc3RCeU9wdGlvbnMob3B0aW9uczogQXJyYXk8UG9NdWx0aXNlbGVjdE9wdGlvbj4sIGxpc3Q6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcclxuICAgICAgICBsZXQgaWR4OiBudW1iZXI7XHJcbiAgICAgICAgbGV0IG5ld0xpc3Q6IEFycmF5PHN0cmluZz47XHJcblxyXG4gICAgICAgIGlmICghbGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5ld0xpc3QgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG5cclxuICAgICAgICBsaXN0Lm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGlkeCA9IG9wdGlvbnMuZmluZEluZGV4KGl0ZW1PcHRpb25zID0+IGl0ZW1PcHRpb25zLnZhbHVlID09PSBpdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0xpc3QucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKkNhcnJlZ2EgbyBPcHRpb25zIGNvbSBvcyB2YWxvcmVzIGRlZmF1bHRzIHBhc3NhZG9zIGNvbW8gcGFyw6JtZXRybyAobGlzdCkqL1xyXG4gICAgcHVibGljIGxvYWRPcHRpb25zTXVsdGlTZWxlY3Qob3B0aW9uczogQXJyYXk8UG9NdWx0aXNlbGVjdE9wdGlvbj4sIGxpc3Q6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcclxuICAgICAgICBsZXQgaWR4OiBudW1iZXI7XHJcblxyXG4gICAgICAgIGlmICghbGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsaXN0Lm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGlkeCA9IG9wdGlvbnMuZmluZEluZGV4KGl0ZW1PcHRpb25zID0+IGl0ZW1PcHRpb25zLnZhbHVlID09PSBpdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHsgbGFiZWw6IGl0ZW0gPT09ICdhbGwnID8gdGhpcy5saXRlcmFsc1snYWxsJ10gOiBpdGVtLCB2YWx1ZTogaXRlbSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qQ2FycmVnYSBvIE9wdGlvbnMgY29tIG9zIHZhbG9yZXMgZGVmYXVsdHMgcGFzc2Fkb3MgY29tbyBwYXLDom1ldHJvIChsaXN0KSovXHJcbiAgICBwdWJsaWMgbG9hZE9wdGlvbnNTZWxlY3Qob3B0aW9uczogQXJyYXk8UG9TZWxlY3RPcHRpb24+LCBzZWxlY3RWYWx1ZTogc3RyaW5nLCB0cmFkVmFsdWUgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBpZHg6IG51bWJlcjtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RWYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0VmFsdWUpIHtcclxuICAgICAgICAgICAgaWR4ID0gb3B0aW9ucy5maW5kSW5kZXgoaXRlbU9wdGlvbnMgPT4gaXRlbU9wdGlvbnMudmFsdWUgPT09IHNlbGVjdFZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaCh7IGxhYmVsOiB0cmFkVmFsdWUgPyB0aGlzLmxpdGVyYWxzW3NlbGVjdFZhbHVlXSA6IHNlbGVjdFZhbHVlLCB2YWx1ZTogc2VsZWN0VmFsdWUgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLypNw6l0b2RvIHF1ZSBjb21wYXJhIDIgb2JqZXRvcyBlIHJldG9ybmEgc2Ugc8OjbyBpZ3VhaXMgb3UgZGlmZXJlbnRlcyovXHJcbiAgICBwdWJsaWMgY29tcGFyZU9iamVjdHMoZmlyc3RPYmplY3Q6IE9iamVjdCwgc2Vjb25kT2JqZWN0OiBPYmplY3QpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgaWYgKCFmaXJzdE9iamVjdCB8fCAhc2Vjb25kT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qUGVnYSBhIGxpc3RhIGRlIG5vbWVzIGRvcyBjYW1wb3MgZG8gb2JqZXRvcyBlIGNvbXBhcmEqL1xyXG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhmaXJzdE9iamVjdCkubGVuZ3RoICE9PSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzZWNvbmRPYmplY3QpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRlbnQgaW4gZmlyc3RPYmplY3QpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRlbnQuc3Vic3RyKDAsIDEpID09PSAnJCcgfHwgY29udGVudC5zdWJzdHIoMCwgMSkgPT09ICdfJykge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmaXJzdE9iamVjdFtjb250ZW50XSAhPT0gc2Vjb25kT2JqZWN0W2NvbnRlbnRdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmZXJlbmNlR2VuZXJhdGlvbihjaGFySW5kOiBzdHJpbmcsIGRhdGVSZWY6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCByZWZlcmVuY2U6IHN0cmluZztcclxuICAgICAgICBsZXQgcmFuZG9tOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIGNvbnN0IGlEYXkgPSBkYXRlUmVmLmdldERhdGUoKTtcclxuICAgICAgICBjb25zdCBpTW9udGggPSBkYXRlUmVmLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICAgIGNvbnN0IGlZZWFyID0gZGF0ZVJlZi5nZXRGdWxsWWVhcigpO1xyXG5cclxuICAgICAgICByZWZlcmVuY2UgPSBgJHt0aGlzLnBhZChpWWVhcil9JHt0aGlzLnBhZChpTW9udGgpfSR7dGhpcy5wYWQoaURheSl9JHtjaGFySW5kfWA7XHJcblxyXG4gICAgICAgIHJhbmRvbSA9IGJ0b2EoYCR7KG5ldyBEYXRlKCkpLmdldFRpbWUoKX1gKTtcclxuICAgICAgICByYW5kb20gPSByYW5kb20ucmVwbGFjZSgvWz1dL2csICcnKTtcclxuICAgICAgICByYW5kb20gPSByYW5kb20uc2xpY2UocmFuZG9tLmxlbmd0aCAtIDMsIHJhbmRvbS5sZW5ndGgpO1xyXG5cclxuICAgICAgICByZXR1cm4gYCR7cmVmZXJlbmNlfSR7cmFuZG9tfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBhZChudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChudW1iZXIgPCAxMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJzAnICsgbnVtYmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobnVtYmVyID4gOTkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChudW1iZXIgKyAnJykuc2xpY2UoMiwgNCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvY3VzSW50ZXJuYWxJbnB1dChpZEZpZWxkOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBmaWVsZENvbXBvbmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkRmllbGQpO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkSW5wdXQgPSAoPEhUTUxTY3JpcHRFbGVtZW50W10+PGFueT5maWVsZENvbXBvbmVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdwby1pbnB1dCcpKVswXTtcclxuICAgICAgICBmaWVsZElucHV0LmZvY3VzKCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|