dts-backoffice-util 2.8.0 → 3.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +53 -10
  3. package/bundles/dts-backoffice-util.umd.js +477 -1127
  4. package/bundles/dts-backoffice-util.umd.js.map +1 -1
  5. package/bundles/dts-backoffice-util.umd.min.js +1 -1
  6. package/bundles/dts-backoffice-util.umd.min.js.map +1 -1
  7. package/esm2015/dts-backoffice-util.js +3 -2
  8. package/esm2015/lib/components/totvs-schedule-execution/totvs-schedule-execution.component.js +3 -2
  9. package/esm2015/lib/components/totvs-schedule-execution/totvs-schedule-execution.model.js +3 -2
  10. package/esm2015/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.js +3 -2
  11. package/esm2015/lib/dts-backoffice-util.module.js +3 -2
  12. package/esm2015/lib/interfaces/filter-range.interface.js +3 -2
  13. package/esm2015/lib/interfaces/totvs-response.interface.js +3 -2
  14. package/esm2015/lib/model/session-info.model.js +3 -2
  15. package/esm2015/lib/pipes/dts-date-format.pipe.js +3 -2
  16. package/esm2015/lib/services/breadcrumb-control.service.js +3 -2
  17. package/esm2015/lib/services/cache-params.service.js +3 -2
  18. package/esm2015/lib/services/menu-datasul.service.js +3 -2
  19. package/esm2015/lib/services/profile.service.js +3 -2
  20. package/esm2015/lib/services/report.service.js +7 -6
  21. package/esm2015/lib/services/session-info.service.js +3 -2
  22. package/esm2015/lib/services/translate.service.js +3 -2
  23. package/esm2015/lib/utils/date.util.js +3 -2
  24. package/esm2015/lib/utils/disclaimer.util.js +3 -2
  25. package/esm2015/lib/utils/field-validation.util.js +3 -2
  26. package/esm2015/lib/utils/file.util.js +21 -10
  27. package/esm2015/lib/utils/filter-range.util.js +3 -2
  28. package/esm2015/lib/utils/generic-functions.utils.js +3 -2
  29. package/esm2015/public-api.js +3 -2
  30. package/fesm2015/dts-backoffice-util.js +66 -34
  31. package/fesm2015/dts-backoffice-util.js.map +1 -1
  32. package/lib/utils/file.util.d.ts +1 -1
  33. package/package.json +8 -7
  34. package/esm5/dts-backoffice-util.js +0 -9
  35. package/esm5/lib/components/totvs-schedule-execution/totvs-schedule-execution.component.js +0 -448
  36. package/esm5/lib/components/totvs-schedule-execution/totvs-schedule-execution.model.js +0 -143
  37. package/esm5/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.js +0 -434
  38. package/esm5/lib/dts-backoffice-util.module.js +0 -53
  39. package/esm5/lib/interfaces/filter-range.interface.js +0 -47
  40. package/esm5/lib/interfaces/totvs-response.interface.js +0 -16
  41. package/esm5/lib/model/session-info.model.js +0 -239
  42. package/esm5/lib/pipes/dts-date-format.pipe.js +0 -36
  43. package/esm5/lib/services/breadcrumb-control.service.js +0 -157
  44. package/esm5/lib/services/cache-params.service.js +0 -61
  45. package/esm5/lib/services/menu-datasul.service.js +0 -92
  46. package/esm5/lib/services/profile.service.js +0 -146
  47. package/esm5/lib/services/report.service.js +0 -137
  48. package/esm5/lib/services/session-info.service.js +0 -64
  49. package/esm5/lib/services/translate.service.js +0 -47
  50. package/esm5/lib/utils/date.util.js +0 -135
  51. package/esm5/lib/utils/disclaimer.util.js +0 -930
  52. package/esm5/lib/utils/field-validation.util.js +0 -358
  53. package/esm5/lib/utils/file.util.js +0 -251
  54. package/esm5/lib/utils/filter-range.util.js +0 -69
  55. package/esm5/lib/utils/generic-functions.utils.js +0 -358
  56. package/esm5/public-api.js +0 -37
  57. package/fesm5/dts-backoffice-util.js +0 -3933
  58. package/fesm5/dts-backoffice-util.js.map +0 -1
@@ -1,358 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- /*
6
- Versão: 1.002
7
- Data Criação: 19/02/2019
8
- */
9
- import { DisclaimerUtil } from './disclaimer.util';
10
- var FieldValidationUtil = /** @class */ (function () {
11
- function FieldValidationUtil(poNotification, poI18nPipe, literals) {
12
- this.literals = {};
13
- this.poNotification = poNotification;
14
- this.poI18nPipe = poI18nPipe;
15
- this.literals = literals;
16
- this.disclaimerUtil = new DisclaimerUtil(this.poNotification, this.poI18nPipe, this.literals);
17
- }
18
- /**
19
- * @param {?} field
20
- * @param {?} value
21
- * @return {?}
22
- */
23
- FieldValidationUtil.prototype.vldFieldCharacter = /**
24
- * @param {?} field
25
- * @param {?} value
26
- * @return {?}
27
- */
28
- function (field, value) {
29
- if (!value || value.trim() === '') {
30
- this.poNotification.error({
31
- message: this.poI18nPipe.transform(this.literals['fieldVldRequered'], [this.literals[field]])
32
- });
33
- return false;
34
- }
35
- return true;
36
- };
37
- // Valida uma faixa de caracteres se o inicial é menor que final
38
- // Valida uma faixa de caracteres se o inicial é menor que final
39
- /**
40
- * @param {?} initialField
41
- * @param {?} finalField
42
- * @param {?} initialValue
43
- * @param {?} finalValue
44
- * @return {?}
45
- */
46
- FieldValidationUtil.prototype.vldRangeCharacter =
47
- // Valida uma faixa de caracteres se o inicial é menor que final
48
- /**
49
- * @param {?} initialField
50
- * @param {?} finalField
51
- * @param {?} initialValue
52
- * @param {?} finalValue
53
- * @return {?}
54
- */
55
- function (initialField, finalField, initialValue, finalValue) {
56
- if (!initialValue || !finalValue) {
57
- return true;
58
- }
59
- if (initialValue.trim().toUpperCase() > finalValue.trim().toUpperCase()) {
60
- this.poNotification.error({
61
- message: this.poI18nPipe.transform(this.literals['fieldVldRange'], [this.literals[initialField], this.literals[finalField]])
62
- });
63
- return false;
64
- }
65
- return true;
66
- };
67
- /**
68
- * @param {?} field
69
- * @param {?} value
70
- * @param {?=} vldValue
71
- * @param {?=} zeroAccept
72
- * @return {?}
73
- */
74
- FieldValidationUtil.prototype.vldFieldNumber = /**
75
- * @param {?} field
76
- * @param {?} value
77
- * @param {?=} vldValue
78
- * @param {?=} zeroAccept
79
- * @return {?}
80
- */
81
- function (field, value, vldValue, zeroAccept) {
82
- if (vldValue === void 0) { vldValue = false; }
83
- if (zeroAccept === void 0) { zeroAccept = false; }
84
- if (vldValue && !this.vldValueOfNumber(field, value)) {
85
- return false;
86
- }
87
- if ((!value) || value <= 0) {
88
- if (value === 0 && zeroAccept === true) {
89
- return true;
90
- }
91
- this.poNotification.error({
92
- message: this.poI18nPipe.transform(this.literals['fieldVldRequered'], [this.literals[field]])
93
- });
94
- return false;
95
- }
96
- return true;
97
- };
98
- /**
99
- * @param {?} field
100
- * @param {?} value
101
- * @return {?}
102
- */
103
- FieldValidationUtil.prototype.vldValueOfNumber = /**
104
- * @param {?} field
105
- * @param {?} value
106
- * @return {?}
107
- */
108
- function (field, value) {
109
- if (value && value < 0) {
110
- this.poNotification.error({ message: this.poI18nPipe.transform(this.literals['fieldVldNumber'], [value.toString(), this.literals[field]]) });
111
- return false;
112
- }
113
- return true;
114
- };
115
- /**
116
- * @param {?} field
117
- * @param {?} value
118
- * @param {?=} vldValue
119
- * @return {?}
120
- */
121
- FieldValidationUtil.prototype.vldFieldPercent = /**
122
- * @param {?} field
123
- * @param {?} value
124
- * @param {?=} vldValue
125
- * @return {?}
126
- */
127
- function (field, value, vldValue) {
128
- if (vldValue === void 0) { vldValue = false; }
129
- if (vldValue && !this.vldValueOfPercent(field, value)) {
130
- return false;
131
- }
132
- if (!this.vldFieldNumber(field, value)) {
133
- return false;
134
- }
135
- return true;
136
- };
137
- /**
138
- * @param {?} field
139
- * @param {?} value
140
- * @return {?}
141
- */
142
- FieldValidationUtil.prototype.vldValueOfPercent = /**
143
- * @param {?} field
144
- * @param {?} value
145
- * @return {?}
146
- */
147
- function (field, value) {
148
- if (value && value < 0) {
149
- this.poNotification.error({ message: this.poI18nPipe.transform(this.literals['fieldVldNumber'], [value.toString(), this.literals[field]]) });
150
- return false;
151
- }
152
- if (value && value > 100) {
153
- this.poNotification.error({ message: this.poI18nPipe.transform(this.literals['fieldVldNumber'], [value.toString(), this.literals[field]]) });
154
- return false;
155
- }
156
- return true;
157
- };
158
- // Valida uma faixa de números se o inicial é menor que final
159
- // Valida uma faixa de números se o inicial é menor que final
160
- /**
161
- * @param {?} initialField
162
- * @param {?} finalField
163
- * @param {?} initialValue
164
- * @param {?} finalValue
165
- * @return {?}
166
- */
167
- FieldValidationUtil.prototype.vldRangeNumber =
168
- // Valida uma faixa de números se o inicial é menor que final
169
- /**
170
- * @param {?} initialField
171
- * @param {?} finalField
172
- * @param {?} initialValue
173
- * @param {?} finalValue
174
- * @return {?}
175
- */
176
- function (initialField, finalField, initialValue, finalValue) {
177
- if (!initialValue) {
178
- initialValue = 0;
179
- }
180
- if (!finalValue) {
181
- finalValue = 0;
182
- }
183
- if (initialValue > finalValue) {
184
- this.poNotification.error({
185
- message: this.poI18nPipe.transform(this.literals['fieldVldRange'], [this.literals[initialField], this.literals[finalField]])
186
- });
187
- return false;
188
- }
189
- return true;
190
- };
191
- /**
192
- * @param {?} field
193
- * @param {?} value
194
- * @return {?}
195
- */
196
- FieldValidationUtil.prototype.vldFieldDate = /**
197
- * @param {?} field
198
- * @param {?} value
199
- * @return {?}
200
- */
201
- function (field, value) {
202
- /** @type {?} */
203
- var valDate = this.disclaimerUtil.ajustDate(value);
204
- if (!this.disclaimerUtil.isValidDate(valDate)) {
205
- this.poNotification.error({
206
- message: this.poI18nPipe.transform(this.literals['fieldVldDate'], [this.literals[field]])
207
- });
208
- return false;
209
- }
210
- return true;
211
- };
212
- // Valida uma faixa de datas se o inicial é menor que final
213
- // Valida uma faixa de datas se o inicial é menor que final
214
- /**
215
- * @param {?} initialField
216
- * @param {?} finalField
217
- * @param {?} initialValue
218
- * @param {?} finalValue
219
- * @return {?}
220
- */
221
- FieldValidationUtil.prototype.vldRangeDate =
222
- // Valida uma faixa de datas se o inicial é menor que final
223
- /**
224
- * @param {?} initialField
225
- * @param {?} finalField
226
- * @param {?} initialValue
227
- * @param {?} finalValue
228
- * @return {?}
229
- */
230
- function (initialField, finalField, initialValue, finalValue) {
231
- if (!initialValue || !finalValue) {
232
- return true;
233
- }
234
- /** @type {?} */
235
- var valInitialDate = this.disclaimerUtil.ajustDate(initialValue).getTime();
236
- /** @type {?} */
237
- var valFinalDate = this.disclaimerUtil.ajustDate(finalValue).getTime();
238
- if (valInitialDate > valFinalDate) {
239
- this.poNotification.error({
240
- message: this.poI18nPipe.transform(this.literals['fieldVldRange'], [this.literals[initialField], this.literals[finalField]])
241
- });
242
- return false;
243
- }
244
- return true;
245
- };
246
- /**
247
- * @param {?} field
248
- * @param {?} value
249
- * @return {?}
250
- */
251
- FieldValidationUtil.prototype.vldFieldMultiSelect = /**
252
- * @param {?} field
253
- * @param {?} value
254
- * @return {?}
255
- */
256
- function (field, value) {
257
- if (!value || value.length === 0) {
258
- this.poNotification.error({
259
- message: this.poI18nPipe.transform(this.literals['fieldVldSelected'], [this.literals[field]])
260
- });
261
- return false;
262
- }
263
- return true;
264
- };
265
- /**
266
- * @param {?} field
267
- * @param {?} value
268
- * @return {?}
269
- */
270
- FieldValidationUtil.prototype.vldFieldCheckbox = /**
271
- * @param {?} field
272
- * @param {?} value
273
- * @return {?}
274
- */
275
- function (field, value) {
276
- if (!value || value.length === 0) {
277
- this.poNotification.error({
278
- message: this.poI18nPipe.transform(this.literals['fieldVldSelected'], [this.literals[field]])
279
- });
280
- return false;
281
- }
282
- return true;
283
- };
284
- // Valida formato conforme regra: "9" apenas números, "X" qualquer caracter, "!" apenas letras maiúsculas
285
- // Valida formato conforme regra: "9" apenas números, "X" qualquer caracter, "!" apenas letras maiúsculas
286
- /**
287
- * @param {?} field
288
- * @param {?} value
289
- * @param {?} format
290
- * @param {?=} replacePoint
291
- * @return {?}
292
- */
293
- FieldValidationUtil.prototype.vldFieldFormat =
294
- // Valida formato conforme regra: "9" apenas números, "X" qualquer caracter, "!" apenas letras maiúsculas
295
- /**
296
- * @param {?} field
297
- * @param {?} value
298
- * @param {?} format
299
- * @param {?=} replacePoint
300
- * @return {?}
301
- */
302
- function (field, value, format, replacePoint) {
303
- if (replacePoint === void 0) { replacePoint = false; }
304
- /** @type {?} */
305
- var lOK = true;
306
- /** @type {?} */
307
- var oldFormat;
308
- if (!value) {
309
- return lOK;
310
- }
311
- /*Retira os pontos do formato*/
312
- if (replacePoint) {
313
- oldFormat = format;
314
- format = format.replace(/\./g, '');
315
- }
316
- if (value.length !== format.length) {
317
- lOK = false;
318
- }
319
- else {
320
- for (var idx = 0; idx < format.length; idx++) {
321
- if (format[idx] === '9') {
322
- if (value[idx].replace(/[0-9]/, '9') !== '9') {
323
- lOK = false;
324
- break;
325
- }
326
- }
327
- if (format[idx] === '!') {
328
- if (value[idx].replace(/[A-Z]/, 'A') !== 'A') {
329
- lOK = false;
330
- break;
331
- }
332
- }
333
- }
334
- }
335
- if (replacePoint) {
336
- format = oldFormat;
337
- }
338
- if (!lOK) {
339
- this.poNotification.error({
340
- message: this.poI18nPipe.transform(this.literals['fieldVldFormat'], [this.literals[field], format])
341
- });
342
- }
343
- return lOK;
344
- };
345
- return FieldValidationUtil;
346
- }());
347
- export { FieldValidationUtil };
348
- if (false) {
349
- /** @type {?} */
350
- FieldValidationUtil.prototype.poNotification;
351
- /** @type {?} */
352
- FieldValidationUtil.prototype.poI18nPipe;
353
- /** @type {?} */
354
- FieldValidationUtil.prototype.literals;
355
- /** @type {?} */
356
- FieldValidationUtil.prototype.disclaimerUtil;
357
- }
358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtdmFsaWRhdGlvbi51dGlsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZHRzLWJhY2tvZmZpY2UtdXRpbC8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9maWVsZC12YWxpZGF0aW9uLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQ7SUFPSSw2QkFDSSxjQUFxQyxFQUNyQyxVQUFzQixFQUN0QixRQUFnQjtRQVBwQixhQUFRLEdBQVEsRUFBRSxDQUFDO1FBU2YsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7Ozs7OztJQUVNLCtDQUFpQjs7Ozs7SUFBeEIsVUFBeUIsS0FBYSxFQUFFLEtBQWE7UUFDakQsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2dCQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ2hHLENBQUMsQ0FBQztZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELGdFQUFnRTs7Ozs7Ozs7O0lBQ3pELCtDQUFpQjs7Ozs7Ozs7O0lBQXhC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QUksWUFBWSxFQUFFO1lBQ2QsTUFBTSxHQUFHLFNBQVMsQ0FBQztTQUN0QjtRQUVELElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDdEcsQ0FBQyxDQUFDO1NBQ047UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDTCwwQkFBQztBQUFELENBQUMsQUExTUQsSUEwTUM7Ozs7SUF6TUcsNkNBQXNDOztJQUN0Qyx5Q0FBdUI7O0lBQ3ZCLHVDQUFtQjs7SUFFbkIsNkNBQStCIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuVmVyc8OjbzogMS4wMDJcclxuRGF0YSBDcmlhw6fDo286IDE5LzAyLzIwMTlcclxuKi9cclxuXHJcbmltcG9ydCB7IFBvTm90aWZpY2F0aW9uU2VydmljZSwgUG9JMThuUGlwZSB9IGZyb20gJ0Bwby11aS9uZy1jb21wb25lbnRzJztcclxuaW1wb3J0IHsgRGlzY2xhaW1lclV0aWwgfSBmcm9tICcuL2Rpc2NsYWltZXIudXRpbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgRmllbGRWYWxpZGF0aW9uVXRpbCB7XHJcbiAgICBwb05vdGlmaWNhdGlvbjogUG9Ob3RpZmljYXRpb25TZXJ2aWNlO1xyXG4gICAgcG9JMThuUGlwZTogUG9JMThuUGlwZTtcclxuICAgIGxpdGVyYWxzOiBhbnkgPSB7fTtcclxuXHJcbiAgICBkaXNjbGFpbWVyVXRpbDogRGlzY2xhaW1lclV0aWw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcG9Ob3RpZmljYXRpb246IFBvTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgICAgICBwb0kxOG5QaXBlOiBQb0kxOG5QaXBlLFxyXG4gICAgICAgIGxpdGVyYWxzOiBPYmplY3RcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24gPSBwb05vdGlmaWNhdGlvbjtcclxuICAgICAgICB0aGlzLnBvSTE4blBpcGUgPSBwb0kxOG5QaXBlO1xyXG4gICAgICAgIHRoaXMubGl0ZXJhbHMgPSBsaXRlcmFscztcclxuICAgICAgICB0aGlzLmRpc2NsYWltZXJVdGlsID0gbmV3IERpc2NsYWltZXJVdGlsKHRoaXMucG9Ob3RpZmljYXRpb24sIHRoaXMucG9JMThuUGlwZSwgdGhpcy5saXRlcmFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZsZEZpZWxkQ2hhcmFjdGVyKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcih7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkUmVxdWVyZWQnXSwgW3RoaXMubGl0ZXJhbHNbZmllbGRdXSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhIHVtYSBmYWl4YSBkZSBjYXJhY3RlcmVzIHNlIG8gaW5pY2lhbCDDqSBtZW5vciBxdWUgZmluYWxcclxuICAgIHB1YmxpYyB2bGRSYW5nZUNoYXJhY3Rlcihpbml0aWFsRmllbGQ6IHN0cmluZywgZmluYWxGaWVsZDogc3RyaW5nLCBpbml0aWFsVmFsdWU6IHN0cmluZywgZmluYWxWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFpbml0aWFsVmFsdWUgfHwgIWZpbmFsVmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlLnRyaW0oKS50b1VwcGVyQ2FzZSgpID4gZmluYWxWYWx1ZS50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGRSYW5nZSddLFxyXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLmxpdGVyYWxzW2luaXRpYWxGaWVsZF0sIHRoaXMubGl0ZXJhbHNbZmluYWxGaWVsZF1dKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmxkRmllbGROdW1iZXIoZmllbGQ6IHN0cmluZywgdmFsdWU6IG51bWJlciwgdmxkVmFsdWUgPSBmYWxzZSwgemVyb0FjY2VwdCA9IGZhbHNlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHZsZFZhbHVlICYmICF0aGlzLnZsZFZhbHVlT2ZOdW1iZXIoZmllbGQsIHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKCF2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IDAgJiYgemVyb0FjY2VwdCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3Ioe1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wb0kxOG5QaXBlLnRyYW5zZm9ybSh0aGlzLmxpdGVyYWxzWydmaWVsZFZsZFJlcXVlcmVkJ10sIFt0aGlzLmxpdGVyYWxzW2ZpZWxkXV0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2bGRWYWx1ZU9mTnVtYmVyKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3IoXHJcbiAgICAgICAgICAgICAgICB7IG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGROdW1iZXInXSwgW3ZhbHVlLnRvU3RyaW5nKCksIHRoaXMubGl0ZXJhbHNbZmllbGRdXSkgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZsZEZpZWxkUGVyY2VudChmaWVsZDogc3RyaW5nLCB2YWx1ZTogbnVtYmVyLCB2bGRWYWx1ZSA9IGZhbHNlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHZsZFZhbHVlICYmICF0aGlzLnZsZFZhbHVlT2ZQZXJjZW50KGZpZWxkLCB2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLnZsZEZpZWxkTnVtYmVyKGZpZWxkLCB2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmxkVmFsdWVPZlBlcmNlbnQoZmllbGQ6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcihcclxuICAgICAgICAgICAgICAgIHsgbWVzc2FnZTogdGhpcy5wb0kxOG5QaXBlLnRyYW5zZm9ybSh0aGlzLmxpdGVyYWxzWydmaWVsZFZsZE51bWJlciddLCBbdmFsdWUudG9TdHJpbmcoKSwgdGhpcy5saXRlcmFsc1tmaWVsZF1dKSB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlID4gMTAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3IoXHJcbiAgICAgICAgICAgICAgICB7IG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGROdW1iZXInXSwgW3ZhbHVlLnRvU3RyaW5nKCksIHRoaXMubGl0ZXJhbHNbZmllbGRdXSkgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhIHVtYSBmYWl4YSBkZSBuw7ptZXJvcyBzZSBvIGluaWNpYWwgw6kgbWVub3IgcXVlIGZpbmFsXHJcbiAgICBwdWJsaWMgdmxkUmFuZ2VOdW1iZXIoaW5pdGlhbEZpZWxkOiBzdHJpbmcsIGZpbmFsRmllbGQ6IHN0cmluZywgaW5pdGlhbFZhbHVlOiBudW1iZXIsIGZpbmFsVmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghaW5pdGlhbFZhbHVlKSB7IGluaXRpYWxWYWx1ZSA9IDA7IH1cclxuICAgICAgICBpZiAoIWZpbmFsVmFsdWUpIHsgZmluYWxWYWx1ZSA9IDA7IH1cclxuXHJcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA+IGZpbmFsVmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcih7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkUmFuZ2UnXSxcclxuICAgICAgICAgICAgICAgICAgICBbdGhpcy5saXRlcmFsc1tpbml0aWFsRmllbGRdLCB0aGlzLmxpdGVyYWxzW2ZpbmFsRmllbGRdXSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZsZEZpZWxkRGF0ZShmaWVsZDogc3RyaW5nLCB2YWx1ZTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHZhbERhdGUgPSB0aGlzLmRpc2NsYWltZXJVdGlsLmFqdXN0RGF0ZSh2YWx1ZSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kaXNjbGFpbWVyVXRpbC5pc1ZhbGlkRGF0ZSh2YWxEYXRlKSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGREYXRlJ10sIFt0aGlzLmxpdGVyYWxzW2ZpZWxkXV0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFZhbGlkYSB1bWEgZmFpeGEgZGUgZGF0YXMgc2UgbyBpbmljaWFsIMOpIG1lbm9yIHF1ZSBmaW5hbFxyXG4gICAgcHVibGljIHZsZFJhbmdlRGF0ZShpbml0aWFsRmllbGQ6IHN0cmluZywgZmluYWxGaWVsZDogc3RyaW5nLCBpbml0aWFsVmFsdWU6IERhdGUsIGZpbmFsVmFsdWU6IERhdGUpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWluaXRpYWxWYWx1ZSB8fCAhZmluYWxWYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbEluaXRpYWxEYXRlID0gdGhpcy5kaXNjbGFpbWVyVXRpbC5hanVzdERhdGUoaW5pdGlhbFZhbHVlKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgY29uc3QgdmFsRmluYWxEYXRlID0gdGhpcy5kaXNjbGFpbWVyVXRpbC5hanVzdERhdGUoZmluYWxWYWx1ZSkuZ2V0VGltZSgpO1xyXG5cclxuICAgICAgICBpZiAodmFsSW5pdGlhbERhdGUgPiB2YWxGaW5hbERhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5wb05vdGlmaWNhdGlvbi5lcnJvcih7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnBvSTE4blBpcGUudHJhbnNmb3JtKHRoaXMubGl0ZXJhbHNbJ2ZpZWxkVmxkUmFuZ2UnXSxcclxuICAgICAgICAgICAgICAgICAgICBbdGhpcy5saXRlcmFsc1tpbml0aWFsRmllbGRdLCB0aGlzLmxpdGVyYWxzW2ZpbmFsRmllbGRdXSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZsZEZpZWxkTXVsdGlTZWxlY3QoZmllbGQ6IHN0cmluZywgdmFsdWU6IEFycmF5PGFueT4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGRTZWxlY3RlZCddLCBbdGhpcy5saXRlcmFsc1tmaWVsZF1dKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmxkRmllbGRDaGVja2JveChmaWVsZDogc3RyaW5nLCB2YWx1ZTogQXJyYXk8c3RyaW5nPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3Ioe1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wb0kxOG5QaXBlLnRyYW5zZm9ybSh0aGlzLmxpdGVyYWxzWydmaWVsZFZsZFNlbGVjdGVkJ10sIFt0aGlzLmxpdGVyYWxzW2ZpZWxkXV0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFZhbGlkYSBmb3JtYXRvIGNvbmZvcm1lIHJlZ3JhOiBcIjlcIiBhcGVuYXMgbsO6bWVyb3MsIFwiWFwiIHF1YWxxdWVyIGNhcmFjdGVyLCBcIiFcIiBhcGVuYXMgbGV0cmFzIG1hacO6c2N1bGFzXHJcbiAgICBwdWJsaWMgdmxkRmllbGRGb3JtYXQoZmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIHJlcGxhY2VQb2ludCA9IGZhbHNlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGxPSyA9IHRydWU7XHJcbiAgICAgICAgbGV0IG9sZEZvcm1hdDogc3RyaW5nO1xyXG5cclxuICAgICAgICBpZiAoIXZhbHVlKSB7IHJldHVybiBsT0s7IH1cclxuXHJcbiAgICAgICAgLypSZXRpcmEgb3MgcG9udG9zIGRvIGZvcm1hdG8qL1xyXG4gICAgICAgIGlmIChyZXBsYWNlUG9pbnQpIHtcclxuICAgICAgICAgICAgb2xkRm9ybWF0ID0gZm9ybWF0O1xyXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZSgvXFwuL2csICcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IGZvcm1hdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbE9LID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZm9ybWF0Lmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JtYXRbaWR4XSA9PT0gJzknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlW2lkeF0ucmVwbGFjZSgvWzAtOV0vLCAnOScpICE9PSAnOScpIHsgbE9LID0gZmFsc2U7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdFtpZHhdID09PSAnIScpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVbaWR4XS5yZXBsYWNlKC9bQS1aXS8sICdBJykgIT09ICdBJykgeyBsT0sgPSBmYWxzZTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlcGxhY2VQb2ludCkge1xyXG4gICAgICAgICAgICBmb3JtYXQgPSBvbGRGb3JtYXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWxPSykge1xyXG4gICAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLmVycm9yKHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucG9JMThuUGlwZS50cmFuc2Zvcm0odGhpcy5saXRlcmFsc1snZmllbGRWbGRGb3JtYXQnXSwgW3RoaXMubGl0ZXJhbHNbZmllbGRdLCBmb3JtYXRdKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsT0s7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -1,251 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- var FileUtil = /** @class */ (function () {
6
- function FileUtil() {
7
- }
8
- /**
9
- * @param {?} datab64
10
- * @param {?} fileName
11
- * @param {?=} contentType
12
- * @return {?}
13
- */
14
- FileUtil.downloadFile = /**
15
- * @param {?} datab64
16
- * @param {?} fileName
17
- * @param {?=} contentType
18
- * @return {?}
19
- */
20
- function (datab64, fileName, contentType) {
21
- /** @type {?} */
22
- var dataBlob = this.b64toBlob(datab64, contentType);
23
- this.download(dataBlob, fileName);
24
- };
25
- /**
26
- * @param {?} data
27
- * @param {?=} dwldDataParam
28
- * @return {?}
29
- */
30
- FileUtil.downloadData = /**
31
- * @param {?} data
32
- * @param {?=} dwldDataParam
33
- * @return {?}
34
- */
35
- function (data, dwldDataParam) {
36
- if (dwldDataParam === void 0) { dwldDataParam = null; }
37
- if (!data) {
38
- return;
39
- }
40
- if (!dwldDataParam) {
41
- dwldDataParam = new DownloadDataParams();
42
- }
43
- if (!dwldDataParam.fileName) {
44
- dwldDataParam.fileName = 'data.csv';
45
- }
46
- if (!dwldDataParam.literals) {
47
- dwldDataParam.literals = {};
48
- }
49
- if (!dwldDataParam.columnDelimiter) {
50
- dwldDataParam.columnDelimiter = ';';
51
- }
52
- if (!dwldDataParam.columnList) {
53
- dwldDataParam.columnList = [];
54
- }
55
- if (!dwldDataParam.columnExclude) {
56
- dwldDataParam.columnExclude = [];
57
- }
58
- /** @type {?} */
59
- var datab64 = btoa(this.jsonToString(data, dwldDataParam));
60
- this.downloadFile(datab64, dwldDataParam.fileName, 'text/csv');
61
- };
62
- /**
63
- * @private
64
- * @param {?} file
65
- * @param {?} fileName
66
- * @return {?}
67
- */
68
- FileUtil.download = /**
69
- * @private
70
- * @param {?} file
71
- * @param {?} fileName
72
- * @return {?}
73
- */
74
- function (file, fileName) {
75
- /** @type {?} */
76
- var binaryData = [file];
77
- /** @type {?} */
78
- var downloadLink = document.createElement('a');
79
- /** @type {?} */
80
- var urlDownload = window.URL.createObjectURL(new Blob(binaryData, { type: file.type }));
81
- /**Verifica se é ie ou edge, pois o mesmo tem tratamento próprio para arquivos blob */
82
- if (navigator.userAgent.toUpperCase().indexOf('.NET') > 0 || navigator.userAgent.toUpperCase().indexOf('EDGE') > 0) {
83
- window.navigator.msSaveOrOpenBlob(file, fileName);
84
- }
85
- else {
86
- downloadLink.href = urlDownload;
87
- downloadLink.setAttribute('download', fileName);
88
- document.body.appendChild(downloadLink);
89
- downloadLink.click();
90
- window.URL.revokeObjectURL(urlDownload);
91
- downloadLink.remove();
92
- }
93
- };
94
- /**
95
- * @private
96
- * @param {?} b64Data
97
- * @param {?=} contentType
98
- * @param {?=} sliceSize
99
- * @return {?}
100
- */
101
- FileUtil.b64toBlob = /**
102
- * @private
103
- * @param {?} b64Data
104
- * @param {?=} contentType
105
- * @param {?=} sliceSize
106
- * @return {?}
107
- */
108
- function (b64Data, contentType, sliceSize) {
109
- contentType = contentType || '';
110
- sliceSize = sliceSize || 512;
111
- /** @type {?} */
112
- var byteCharacters = atob(b64Data);
113
- /** @type {?} */
114
- var byteArrays = [];
115
- for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
116
- /** @type {?} */
117
- var slice = byteCharacters.slice(offset, offset + sliceSize);
118
- /** @type {?} */
119
- var byteNumbers = new Array(slice.length);
120
- for (var i = 0; i < slice.length; i++) {
121
- byteNumbers[i] = slice.charCodeAt(i);
122
- }
123
- /** @type {?} */
124
- var byteArray = new Uint8Array(byteNumbers);
125
- byteArrays.push(byteArray);
126
- }
127
- /** @type {?} */
128
- var blob = new Blob(byteArrays, { type: contentType });
129
- return blob;
130
- };
131
- /**
132
- * @private
133
- * @param {?} jsonData
134
- * @param {?} dwldDataParam
135
- * @return {?}
136
- */
137
- FileUtil.jsonToString = /**
138
- * @private
139
- * @param {?} jsonData
140
- * @param {?} dwldDataParam
141
- * @return {?}
142
- */
143
- function (jsonData, dwldDataParam) {
144
- if (!jsonData || jsonData.length === 0) {
145
- return '';
146
- }
147
- /** @type {?} */
148
- var lineDelimiter = '\n';
149
- /** @type {?} */
150
- var columnHeader = null;
151
- /** @type {?} */
152
- var keys = [];
153
- /** @type {?} */
154
- var includeKey;
155
- Object.keys(jsonData[0]).forEach((/**
156
- * @param {?} key
157
- * @return {?}
158
- */
159
- function (key) {
160
- includeKey = true;
161
- if (dwldDataParam.columnList.length > 0 && dwldDataParam.columnList.indexOf(key) === -1) {
162
- includeKey = false;
163
- }
164
- if (dwldDataParam.columnExclude.length > 0 && dwldDataParam.columnExclude.indexOf(key) !== -1) {
165
- includeKey = false;
166
- }
167
- if (includeKey) {
168
- keys.push(key);
169
- columnHeader = (!columnHeader) ? '' : columnHeader + dwldDataParam.columnDelimiter;
170
- columnHeader += (dwldDataParam.literals[key]) ? dwldDataParam.literals[key] : key;
171
- }
172
- }));
173
- /** @type {?} */
174
- var lineStr = jsonData.reduce((/**
175
- * @param {?} accLineStr
176
- * @param {?} currentItem
177
- * @return {?}
178
- */
179
- function (accLineStr, currentItem) {
180
- /** @type {?} */
181
- var first = true;
182
- /** @type {?} */
183
- var columnValue = null;
184
- keys.forEach((/**
185
- * @param {?} key
186
- * @return {?}
187
- */
188
- function (key) {
189
- if (!first) {
190
- accLineStr += dwldDataParam.columnDelimiter;
191
- }
192
- columnValue = currentItem[key];
193
- if (columnValue === null || columnValue === undefined) {
194
- columnValue = '';
195
- }
196
- switch (typeof (columnValue)) {
197
- case 'number':
198
- columnValue = columnValue.toLocaleString();
199
- break;
200
- case 'boolean':
201
- columnValue = (dwldDataParam.literals["" + columnValue]) ?
202
- dwldDataParam.literals["" + columnValue] : columnValue;
203
- break;
204
- case 'object':
205
- columnValue = JSON.stringify(columnValue);
206
- }
207
- accLineStr += columnValue;
208
- first = false;
209
- }));
210
- return accLineStr + lineDelimiter;
211
- }), columnHeader + lineDelimiter);
212
- return lineStr;
213
- };
214
- return FileUtil;
215
- }());
216
- export { FileUtil };
217
- /**
218
- * @record
219
- */
220
- export function IDownloadDataParams() { }
221
- if (false) {
222
- /** @type {?} */
223
- IDownloadDataParams.prototype.fileName;
224
- /** @type {?} */
225
- IDownloadDataParams.prototype.literals;
226
- /** @type {?} */
227
- IDownloadDataParams.prototype.columnDelimiter;
228
- /** @type {?} */
229
- IDownloadDataParams.prototype.columnList;
230
- /** @type {?} */
231
- IDownloadDataParams.prototype.columnExclude;
232
- }
233
- var DownloadDataParams = /** @class */ (function () {
234
- function DownloadDataParams() {
235
- }
236
- return DownloadDataParams;
237
- }());
238
- export { DownloadDataParams };
239
- if (false) {
240
- /** @type {?} */
241
- DownloadDataParams.prototype.fileName;
242
- /** @type {?} */
243
- DownloadDataParams.prototype.literals;
244
- /** @type {?} */
245
- DownloadDataParams.prototype.columnDelimiter;
246
- /** @type {?} */
247
- DownloadDataParams.prototype.columnList;
248
- /** @type {?} */
249
- DownloadDataParams.prototype.columnExclude;
250
- }
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS51dGlsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZHRzLWJhY2tvZmZpY2UtdXRpbC8iLCJzb3VyY2VzIjpbImxpYi91dGlscy9maWxlLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0lBRUk7SUFDSSxDQUFDOzs7Ozs7O0lBRUUscUJBQVk7Ozs7OztJQUFuQixVQUFvQixPQUFZLEVBQUUsUUFBZ0IsRUFBRSxXQUFvQjs7WUFDOUQsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDOzs7Ozs7SUFFTSxxQkFBWTs7Ozs7SUFBbkIsVUFBb0IsSUFBZ0IsRUFBRSxhQUF5QztRQUF6Qyw4QkFBQSxFQUFBLG9CQUF5QztRQUMzRSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXRCLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFBRSxhQUFhLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1NBQUU7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFBRSxhQUFhLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztTQUFFO1FBQ3JFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQUUsYUFBYSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FBRTtRQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRTtZQUFFLGFBQWEsQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDO1NBQUU7UUFDNUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUU7WUFBRSxhQUFhLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztTQUFFO1FBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFO1lBQUUsYUFBYSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7U0FB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TEcsc0NBQWlCOztJQUNqQixzQ0FBYzs7SUFDZCw2Q0FBd0I7O0lBQ3hCLHdDQUEwQjs7SUFDMUIsMkNBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEZpbGVVdGlsIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICkgeyB9XHJcblxyXG4gICAgc3RhdGljIGRvd25sb2FkRmlsZShkYXRhYjY0OiBhbnksIGZpbGVOYW1lOiBzdHJpbmcsIGNvbnRlbnRUeXBlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZGF0YUJsb2IgPSB0aGlzLmI2NHRvQmxvYihkYXRhYjY0LCBjb250ZW50VHlwZSk7XHJcbiAgICAgICAgdGhpcy5kb3dubG9hZChkYXRhQmxvYiwgZmlsZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBkb3dubG9hZERhdGEoZGF0YTogQXJyYXk8YW55PiwgZHdsZERhdGFQYXJhbTogSURvd25sb2FkRGF0YVBhcmFtcyA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRhdGEpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGlmICghZHdsZERhdGFQYXJhbSkgeyBkd2xkRGF0YVBhcmFtID0gbmV3IERvd25sb2FkRGF0YVBhcmFtcygpOyB9XHJcbiAgICAgICAgaWYgKCFkd2xkRGF0YVBhcmFtLmZpbGVOYW1lKSB7IGR3bGREYXRhUGFyYW0uZmlsZU5hbWUgPSAnZGF0YS5jc3YnOyB9XHJcbiAgICAgICAgaWYgKCFkd2xkRGF0YVBhcmFtLmxpdGVyYWxzKSB7IGR3bGREYXRhUGFyYW0ubGl0ZXJhbHMgPSB7fTsgfVxyXG4gICAgICAgIGlmICghZHdsZERhdGFQYXJhbS5jb2x1bW5EZWxpbWl0ZXIpIHsgZHdsZERhdGFQYXJhbS5jb2x1bW5EZWxpbWl0ZXIgPSAnOyc7IH1cclxuICAgICAgICBpZiAoIWR3bGREYXRhUGFyYW0uY29sdW1uTGlzdCkgeyBkd2xkRGF0YVBhcmFtLmNvbHVtbkxpc3QgPSBbXTsgfVxyXG4gICAgICAgIGlmICghZHdsZERhdGFQYXJhbS5jb2x1bW5FeGNsdWRlKSB7IGR3bGREYXRhUGFyYW0uY29sdW1uRXhjbHVkZSA9IFtdOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGFiNjQgPSBidG9hKHRoaXMuanNvblRvU3RyaW5nKGRhdGEsIGR3bGREYXRhUGFyYW0pKTtcclxuICAgICAgICB0aGlzLmRvd25sb2FkRmlsZShkYXRhYjY0LCBkd2xkRGF0YVBhcmFtLmZpbGVOYW1lLCAndGV4dC9jc3YnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBkb3dubG9hZChmaWxlOiBCbG9iLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYmluYXJ5RGF0YSA9IFtmaWxlXTtcclxuICAgICAgICBjb25zdCBkb3dubG9hZExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgY29uc3QgdXJsRG93bmxvYWQgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihiaW5hcnlEYXRhLCB7IHR5cGU6IGZpbGUudHlwZSB9KSk7XHJcblxyXG4gICAgICAgIC8qKlZlcmlmaWNhIHNlIMOpIGllIG91IGVkZ2UsIHBvaXMgbyBtZXNtbyB0ZW0gdHJhdGFtZW50byBwcsOzcHJpbyBwYXJhIGFycXVpdm9zIGJsb2IgKi9cclxuICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoJy5ORVQnKSA+IDAgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoJ0VER0UnKSA+IDApIHtcclxuICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGZpbGUsIGZpbGVOYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkb3dubG9hZExpbmsuaHJlZiA9IHVybERvd25sb2FkO1xyXG4gICAgICAgICAgICBkb3dubG9hZExpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVOYW1lKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb3dubG9hZExpbmspO1xyXG4gICAgICAgICAgICBkb3dubG9hZExpbmsuY2xpY2soKTtcclxuICAgICAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsRG93bmxvYWQpO1xyXG4gICAgICAgICAgICBkb3dubG9hZExpbmsucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGI2NHRvQmxvYihiNjREYXRhOiBhbnksIGNvbnRlbnRUeXBlPzogc3RyaW5nLCBzbGljZVNpemU/OiBudW1iZXIpOiBCbG9iIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlIHx8ICcnO1xyXG4gICAgICAgIHNsaWNlU2l6ZSA9IHNsaWNlU2l6ZSB8fCA1MTI7XHJcblxyXG4gICAgICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTtcclxuICAgICAgICBjb25zdCBieXRlQXJyYXlzID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBzbGljZSA9IGJ5dGVDaGFyYWN0ZXJzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2xpY2VTaXplKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KHNsaWNlLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGJ5dGVOdW1iZXJzW2ldID0gc2xpY2UuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xyXG4gICAgICAgICAgICBieXRlQXJyYXlzLnB1c2goYnl0ZUFycmF5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihieXRlQXJyYXlzLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xyXG4gICAgICAgIHJldHVybiBibG9iO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGpzb25Ub1N0cmluZyhqc29uRGF0YTogQXJyYXk8YW55PiwgZHdsZERhdGFQYXJhbTogSURvd25sb2FkRGF0YVBhcmFtcyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCFqc29uRGF0YSB8fCBqc29uRGF0YS5sZW5ndGggPT09IDApIHsgcmV0dXJuICcnOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmVEZWxpbWl0ZXIgPSAnXFxuJztcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbkhlYWRlciA9IG51bGw7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xyXG4gICAgICAgIGxldCBpbmNsdWRlS2V5OiBib29sZWFuO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGpzb25EYXRhWzBdKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGluY2x1ZGVLZXkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGR3bGREYXRhUGFyYW0uY29sdW1uTGlzdC5sZW5ndGggPiAwICYmIGR3bGREYXRhUGFyYW0uY29sdW1uTGlzdC5pbmRleE9mKGtleSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpbmNsdWRlS2V5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGR3bGREYXRhUGFyYW0uY29sdW1uRXhjbHVkZS5sZW5ndGggPiAwICYmIGR3bGREYXRhUGFyYW0uY29sdW1uRXhjbHVkZS5pbmRleE9mKGtleSkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpbmNsdWRlS2V5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpbmNsdWRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgICAgIGNvbHVtbkhlYWRlciA9ICghY29sdW1uSGVhZGVyKSA/ICcnIDogY29sdW1uSGVhZGVyICsgZHdsZERhdGFQYXJhbS5jb2x1bW5EZWxpbWl0ZXI7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5IZWFkZXIgKz0gKGR3bGREYXRhUGFyYW0ubGl0ZXJhbHNba2V5XSkgPyBkd2xkRGF0YVBhcmFtLmxpdGVyYWxzW2tleV0gOiBrZXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgbGluZVN0ciA9IGpzb25EYXRhLnJlZHVjZSgoYWNjTGluZVN0ciwgY3VycmVudEl0ZW0pID0+IHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGNvbHVtblZhbHVlID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgeyBhY2NMaW5lU3RyICs9IGR3bGREYXRhUGFyYW0uY29sdW1uRGVsaW1pdGVyOyB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSBjdXJyZW50SXRlbVtrZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtblZhbHVlID09PSBudWxsIHx8IGNvbHVtblZhbHVlID09PSB1bmRlZmluZWQpIHsgY29sdW1uVmFsdWUgPSAnJzsgfVxyXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgKGNvbHVtblZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlID0gY29sdW1uVmFsdWUudG9Mb2NhbGVTdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlID0gKGR3bGREYXRhUGFyYW0ubGl0ZXJhbHNbYCR7Y29sdW1uVmFsdWV9YF0pID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3bGREYXRhUGFyYW0ubGl0ZXJhbHNbYCR7Y29sdW1uVmFsdWV9YF0gOiBjb2x1bW5WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uVmFsdWUgPSBKU09OLnN0cmluZ2lmeShjb2x1bW5WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhY2NMaW5lU3RyICs9IGNvbHVtblZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGFjY0xpbmVTdHIgKyBsaW5lRGVsaW1pdGVyO1xyXG5cclxuICAgICAgICB9LCBjb2x1bW5IZWFkZXIgKyBsaW5lRGVsaW1pdGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpbmVTdHI7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSURvd25sb2FkRGF0YVBhcmFtcyB7XHJcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgbGl0ZXJhbHM6IGFueTtcclxuICAgIGNvbHVtbkRlbGltaXRlcjogc3RyaW5nO1xyXG4gICAgY29sdW1uTGlzdDogQXJyYXk8c3RyaW5nPjtcclxuICAgIGNvbHVtbkV4Y2x1ZGU6IEFycmF5PHN0cmluZz47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEb3dubG9hZERhdGFQYXJhbXMgaW1wbGVtZW50cyBJRG93bmxvYWREYXRhUGFyYW1zIHtcclxuICAgIGZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgICBsaXRlcmFsczogYW55O1xyXG4gICAgY29sdW1uRGVsaW1pdGVyOiBzdHJpbmc7XHJcbiAgICBjb2x1bW5MaXN0OiBBcnJheTxzdHJpbmc+O1xyXG4gICAgY29sdW1uRXhjbHVkZTogQXJyYXk8c3RyaW5nPjtcclxufVxyXG4iXX0=