bx-rest 0.0.15 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/public-api.mjs +2 -6
- package/fesm2015/bx-rest.mjs +1 -1777
- package/fesm2015/bx-rest.mjs.map +1 -1
- package/fesm2020/bx-rest.mjs +1 -1772
- package/fesm2020/bx-rest.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -3
- package/consts/part-name-metods.d.ts +0 -74
- package/consts/time.d.ts +0 -3
- package/esm2020/consts/part-name-metods.mjs +0 -75
- package/esm2020/consts/time.mjs +0 -4
- package/esm2020/functions/mapResult.mjs +0 -7
- package/esm2020/functions/serializeJavascript.mjs +0 -200
- package/esm2020/map/base.mjs +0 -14
- package/esm2020/map/lists/element.mjs +0 -22
- package/esm2020/request/bx-rest.module.mjs +0 -28
- package/esm2020/request/lists/element.mjs +0 -55
- package/esm2020/request/lists.mjs +0 -46
- package/esm2020/request/user.mjs +0 -227
- package/esm2020/services/base.mjs +0 -174
- package/esm2020/services/http/HttpBX.mjs +0 -128
- package/esm2020/services/http/HttpData.mjs +0 -124
- package/esm2020/services/http/base/base.mjs +0 -29
- package/esm2020/services/http/base/http.mjs +0 -28
- package/esm2020/services/http/http.mjs +0 -135
- package/esm2020/services/http/sessionKey.mjs +0 -180
- package/esm2020/services/map/base.mjs +0 -14
- package/esm2020/services/map/rest/user.mjs +0 -89
- package/esm2020/services/snack-bar/snack-bar.service.mjs +0 -42
- package/esm2020/services/snack-bar/toast-message/toast-message.component.mjs +0 -31
- package/esm2020/services/vanilla/JSON.mjs +0 -20
- package/esm2020/services/vanilla/localStorage.mjs +0 -35
- package/esm2020/services/vanilla//321/201ookies.mjs +0 -44
- package/esm2020/store/auth.mjs +0 -26
- package/esm2020/store/users.mjs +0 -67
- package/esm2020/typification/auth/save.mjs +0 -2
- package/esm2020/typification/rest/api-lib.mjs +0 -21
- package/esm2020/typification/rest/base/YesNo.mjs +0 -2
- package/esm2020/typification/rest/base/httpAnswerBX.mjs +0 -2
- package/esm2020/typification/rest/batch/batchRequestParam.mjs +0 -2
- package/esm2020/typification/rest/lib.mjs +0 -2
- package/esm2020/typification/rest/lists/element/get.mjs +0 -2
- package/esm2020/typification/rest/settings.mjs +0 -2
- package/esm2020/typification/rest/support/param.mjs +0 -2
- package/esm2020/typification/rest/user/UserFilterSearch.mjs +0 -2
- package/esm2020/typification/rest/user/get.mjs +0 -2
- package/esm2020/typification/rest/user/user.mjs +0 -2
- package/functions/mapResult.d.ts +0 -2
- package/functions/serializeJavascript.d.ts +0 -2
- package/map/base.d.ts +0 -6
- package/map/lists/element.d.ts +0 -8
- package/request/bx-rest.module.d.ts +0 -8
- package/request/lists/element.d.ts +0 -27
- package/request/lists.d.ts +0 -18
- package/request/user.d.ts +0 -59
- package/services/base.d.ts +0 -32
- package/services/http/HttpBX.d.ts +0 -26
- package/services/http/HttpData.d.ts +0 -13
- package/services/http/base/base.d.ts +0 -16
- package/services/http/base/http.d.ts +0 -7
- package/services/http/http.d.ts +0 -31
- package/services/http/sessionKey.d.ts +0 -34
- package/services/map/base.d.ts +0 -6
- package/services/map/rest/user.d.ts +0 -12
- package/services/snack-bar/snack-bar.service.d.ts +0 -12
- package/services/snack-bar/toast-message/toast-message.component.d.ts +0 -16
- package/services/vanilla/JSON.d.ts +0 -7
- package/services/vanilla/localStorage.d.ts +0 -10
- package/services/vanilla//321/201ookies.d.ts +0 -9
- package/store/auth.d.ts +0 -20
- package/store/users.d.ts +0 -34
- package/typification/auth/save.d.ts +0 -14
- package/typification/rest/api-lib.d.ts +0 -9
- package/typification/rest/base/YesNo.d.ts +0 -1
- package/typification/rest/base/httpAnswerBX.d.ts +0 -15
- package/typification/rest/batch/batchRequestParam.d.ts +0 -16
- package/typification/rest/lib.d.ts +0 -18
- package/typification/rest/lists/element/get.d.ts +0 -28
- package/typification/rest/settings.d.ts +0 -6
- package/typification/rest/support/param.d.ts +0 -5
- package/typification/rest/user/UserFilterSearch.d.ts +0 -43
- package/typification/rest/user/get.d.ts +0 -13
- package/typification/rest/user/user.d.ts +0 -62
package/esm2020/request/user.mjs
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { Observable, of } from 'rxjs';
|
|
2
|
-
import { first, map, mergeMap, tap } from 'rxjs/operators';
|
|
3
|
-
import clone from 'just-clone';
|
|
4
|
-
import HttpBXServices from '../services/http/HttpBX';
|
|
5
|
-
import { saveArr, saveSelf } from '../store/users';
|
|
6
|
-
// import DateTrace from 'bx-rest/services/api/trace/metods/date'
|
|
7
|
-
import SnackBarService from '../services/snack-bar/snack-bar.service';
|
|
8
|
-
import { $get, $list, $search, $update, $user } from '../consts/part-name-metods';
|
|
9
|
-
import { Injectable } from '@angular/core';
|
|
10
|
-
import { mapResult } from '../functions/mapResult';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "@ngrx/store";
|
|
13
|
-
import * as i2 from "../services/map/rest/user";
|
|
14
|
-
import * as i3 from "@angular/common";
|
|
15
|
-
export class BXRestUser {
|
|
16
|
-
constructor(http, snackBar,
|
|
17
|
-
// private img: ImgServices,
|
|
18
|
-
//private dateTrace: DateTrace,
|
|
19
|
-
store, userMap, datePipe) {
|
|
20
|
-
this.http = http;
|
|
21
|
-
this.snackBar = snackBar;
|
|
22
|
-
this.store = store;
|
|
23
|
-
this.userMap = userMap;
|
|
24
|
-
this.datePipe = datePipe;
|
|
25
|
-
this.url = {
|
|
26
|
-
admin: [$user, 'admin'],
|
|
27
|
-
get: [$user, $get],
|
|
28
|
-
current: [$user, 'current'],
|
|
29
|
-
update: [$user, $update],
|
|
30
|
-
search: [$user, $search],
|
|
31
|
-
access: [$user, 'access'],
|
|
32
|
-
// AU - все авторизованные пользователи
|
|
33
|
-
// D1 - подразделение с id=1
|
|
34
|
-
// G1 - группа с id=1
|
|
35
|
-
fields: [$user, 'fields'],
|
|
36
|
-
userfield: {
|
|
37
|
-
list: [$user, 'userfield', $list]
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
this.def = {
|
|
41
|
-
params: { ACTIVE: 1, start: 0 }
|
|
42
|
-
};
|
|
43
|
-
this.user$ = this.store.select('users');
|
|
44
|
-
}
|
|
45
|
-
admin() {
|
|
46
|
-
return this.http.get(this.url.admin);
|
|
47
|
-
}
|
|
48
|
-
get(params = {}) {
|
|
49
|
-
let copyParams = clone(params);
|
|
50
|
-
this.setDefParam(copyParams);
|
|
51
|
-
return this.http.post(this.url.get, copyParams, 'Не удалось получить пользователей')
|
|
52
|
-
.pipe(tap(v => {
|
|
53
|
-
if (v && v.result) {
|
|
54
|
-
this.saveArrUser(v.result);
|
|
55
|
-
}
|
|
56
|
-
}));
|
|
57
|
-
}
|
|
58
|
-
current(update = false) {
|
|
59
|
-
if (update) {
|
|
60
|
-
return this.getSelfHttp();
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
return this.user$.pipe(mergeMap(v => {
|
|
64
|
-
if (v && v.self) {
|
|
65
|
-
return of(v.self);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
return this.getSelfHttp();
|
|
69
|
-
}
|
|
70
|
-
}), first());
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
getSelfHttp() {
|
|
74
|
-
return this.http.get(this.url.current, {}, 'Не удалось получить пользователя')
|
|
75
|
-
.pipe(map(v => {
|
|
76
|
-
if (v && v.result) {
|
|
77
|
-
return this.userMap.HttpToBX(v.result);
|
|
78
|
-
}
|
|
79
|
-
return undefined;
|
|
80
|
-
}), tap(v => {
|
|
81
|
-
if (v) {
|
|
82
|
-
this.store.dispatch(saveSelf({ self: v }));
|
|
83
|
-
}
|
|
84
|
-
}));
|
|
85
|
-
}
|
|
86
|
-
access(access, textError = 'Не удалось получить права') {
|
|
87
|
-
return this.http.get(this.url.access, { ACCESS: access }, textError);
|
|
88
|
-
}
|
|
89
|
-
// getAll(params: iBXGetParam = {}): Observable<iBXRestUser [] | undefined> {
|
|
90
|
-
// if (!Object.keys(params).length) {
|
|
91
|
-
// params = clone(this.def.params)
|
|
92
|
-
// }
|
|
93
|
-
//
|
|
94
|
-
// const saveAllUser = compare(params, this.def.params)
|
|
95
|
-
// return this.user$.pipe(
|
|
96
|
-
// take(1),
|
|
97
|
-
// mergeMap(v => {
|
|
98
|
-
// if (v.load.all) {
|
|
99
|
-
// if (compare(this.def.params, params)) {
|
|
100
|
-
// return of(clone(v.data))
|
|
101
|
-
// }
|
|
102
|
-
// }
|
|
103
|
-
//
|
|
104
|
-
// return this.getEndArray(params).pipe(
|
|
105
|
-
// take(1),
|
|
106
|
-
// map(v => {
|
|
107
|
-
// if (v && v.result) {
|
|
108
|
-
// let cl = clone(v.result)
|
|
109
|
-
// return this.saveArrUser(cl)
|
|
110
|
-
// }
|
|
111
|
-
// return undefined
|
|
112
|
-
// }),
|
|
113
|
-
// )
|
|
114
|
-
// }),
|
|
115
|
-
// tap(v => {
|
|
116
|
-
// if (v && v.length && saveAllUser) {
|
|
117
|
-
// this.store.dispatch(loadAll({load: true}))
|
|
118
|
-
// }
|
|
119
|
-
// params.start = this.def.params.start
|
|
120
|
-
// })
|
|
121
|
-
// )
|
|
122
|
-
// }
|
|
123
|
-
saveArrUser(users) {
|
|
124
|
-
let result = [];
|
|
125
|
-
for (const user of users) {
|
|
126
|
-
result.push(this.userMap.HttpToBX(user));
|
|
127
|
-
}
|
|
128
|
-
this.store.dispatch(saveArr({ arr: result }));
|
|
129
|
-
return result;
|
|
130
|
-
}
|
|
131
|
-
search(params) {
|
|
132
|
-
if (typeof params === 'string') {
|
|
133
|
-
params = { FIND: params };
|
|
134
|
-
}
|
|
135
|
-
if (typeof params.ACTIVE !== 'boolean') {
|
|
136
|
-
params.ACTIVE = true;
|
|
137
|
-
}
|
|
138
|
-
return this.http.get(this.url.search, params, 'Сервер не отвечает на запрос поиска');
|
|
139
|
-
}
|
|
140
|
-
fields() {
|
|
141
|
-
return this.http.get(this.url.fields);
|
|
142
|
-
}
|
|
143
|
-
update(user, fieldUpdate) {
|
|
144
|
-
if (fieldUpdate && fieldUpdate.length) {
|
|
145
|
-
let sendData = {
|
|
146
|
-
ID: user.ID,
|
|
147
|
-
};
|
|
148
|
-
const userBX = this.userMap.BXtoHttp(user);
|
|
149
|
-
for (const field of fieldUpdate) {
|
|
150
|
-
if (userBX[field]) {
|
|
151
|
-
sendData[field] = userBX[field];
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
this.snackBar.error('Одно из указанных полей отправлено не верно');
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return this.http.post(this.url.update, sendData, 'Не удалось обновить пользователя с ID' + user.ID);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
this.snackBar.error('Не указано ни одно поле для редактирования пользователя');
|
|
161
|
-
return of({});
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
// getEndArray(params: UserFilter = {}): Observable<iHttpAnswerBX<iBXRestUserHttp[]> | undefined> {
|
|
165
|
-
// return this.get(params).pipe(
|
|
166
|
-
// mergeMap(items => {
|
|
167
|
-
// if (items && items.result && typeof items.result === 'object') {
|
|
168
|
-
// if (items.next) {
|
|
169
|
-
// params.start = items.next
|
|
170
|
-
// return this.getEndArray(params).pipe(map(vEnd => {
|
|
171
|
-
// if (vEnd && items.result && vEnd.result) {
|
|
172
|
-
// return {result: [...items.result, ...vEnd.result]}
|
|
173
|
-
// }
|
|
174
|
-
// return (items) ? items : undefined
|
|
175
|
-
// }))
|
|
176
|
-
// }
|
|
177
|
-
// return of(items)
|
|
178
|
-
// } else {
|
|
179
|
-
// return of(undefined)
|
|
180
|
-
// }
|
|
181
|
-
// }),
|
|
182
|
-
// )
|
|
183
|
-
// }
|
|
184
|
-
setDefParam(params) {
|
|
185
|
-
if (!params.hasOwnProperty('ACTIVE')) {
|
|
186
|
-
params.ACTIVE = this.def.params.ACTIVE;
|
|
187
|
-
}
|
|
188
|
-
if (params.ACTIVE && params.ACTIVE === 2) {
|
|
189
|
-
delete params.ACTIVE;
|
|
190
|
-
}
|
|
191
|
-
if (!params.hasOwnProperty('start')) {
|
|
192
|
-
params.start = this.def.params.start;
|
|
193
|
-
}
|
|
194
|
-
if (params.UF_DEPARTMENT && !params.UF_DEPARTMENT.length) {
|
|
195
|
-
delete params.UF_DEPARTMENT;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
BXRestUser.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BXRestUser, deps: [{ token: HttpBXServices }, { token: SnackBarService }, { token: i1.Store }, { token: i2.BitrixApiUserMapServices }, { token: i3.DatePipe }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
200
|
-
BXRestUser.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BXRestUser, providedIn: 'root' });
|
|
201
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BXRestUser, decorators: [{
|
|
202
|
-
type: Injectable,
|
|
203
|
-
args: [{
|
|
204
|
-
providedIn: 'root'
|
|
205
|
-
}]
|
|
206
|
-
}], ctorParameters: function () { return [{ type: HttpBXServices }, { type: SnackBarService }, { type: i1.Store }, { type: i2.BitrixApiUserMapServices }, { type: i3.DatePipe }]; } });
|
|
207
|
-
export class BXRestUserRes extends new Proxy(BXRestUser, {
|
|
208
|
-
get(target, prop, receiver) {
|
|
209
|
-
const res = Reflect.get(target, prop, receiver);
|
|
210
|
-
if (res in Observable) {
|
|
211
|
-
return Reflect.get(target, prop, receiver).pipe(
|
|
212
|
-
// @ts-ignore
|
|
213
|
-
map(v => mapResult(v)));
|
|
214
|
-
}
|
|
215
|
-
return res;
|
|
216
|
-
}
|
|
217
|
-
}) {
|
|
218
|
-
}
|
|
219
|
-
BXRestUserRes.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BXRestUserRes, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
220
|
-
BXRestUserRes.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BXRestUserRes, providedIn: 'root' });
|
|
221
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BXRestUserRes, decorators: [{
|
|
222
|
-
type: Injectable,
|
|
223
|
-
args: [{
|
|
224
|
-
providedIn: 'root'
|
|
225
|
-
}]
|
|
226
|
-
}] });
|
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2J4LXJlc3Qvc3JjL3JlcXVlc3QvdXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBRTlCLE9BQU8sY0FBYyxNQUFNLHlCQUF5QixDQUFBO0FBR3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFjLE1BQU0sZ0JBQWdCLENBQUE7QUFHOUQsaUVBQWlFO0FBQ2pFLE9BQU8sZUFBZSxNQUFNLHlDQUF5QyxDQUFBO0FBR3JFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFDakYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7Ozs7O0FBS2xELE1BQU0sT0FBTyxVQUFVO0lBd0JyQixZQUNVLElBQW9CLEVBQ3BCLFFBQXlCO0lBQ2pDLDRCQUE0QjtJQUM1QiwrQkFBK0I7SUFDdkIsS0FBbUMsRUFDbkMsT0FBaUMsRUFDakMsUUFBa0I7UUFObEIsU0FBSSxHQUFKLElBQUksQ0FBZ0I7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFHekIsVUFBSyxHQUFMLEtBQUssQ0FBOEI7UUFDbkMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQTdCNUIsUUFBRyxHQUFHO1lBQ0osS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUN2QixH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QVVULFVBQVUsY0FGVCxNQUFNOzJGQUVQLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzBEQWhCTSxjQUFjLFlBT2QsZUFBZTtBQXNPdEIsTUFBTSxPQUFPLGFBQWMsU0FBUSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7SUFDdkQsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUTtRQUN4QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDL0MsSUFBRyxHQUFHLElBQUksVUFBVSxFQUFDO1lBQ25CLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUk7WUFDN0MsYUFBYTtZQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN2QixDQUFBO1NBQ0Y7UUFFRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7Q0FDRixDQUFDOzswR0FaVyxhQUFhOzhHQUFiLGFBQWEsY0FGWixNQUFNOzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlyc3QsIG1hcCwgbWVyZ2VNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IGNsb25lIGZyb20gJ2p1c3QtY2xvbmUnXG5pbXBvcnQgeyBpQlhHZXRQYXJhbSB9IGZyb20gJy4uL3R5cGlmaWNhdGlvbi9yZXN0L3VzZXIvZ2V0J1xuaW1wb3J0IEh0dHBCWFNlcnZpY2VzIGZyb20gJy4uL3NlcnZpY2VzL2h0dHAvSHR0cEJYJ1xuaW1wb3J0IFVzZXJGaWx0ZXJTZWFyY2ggZnJvbSAnLi4vdHlwaWZpY2F0aW9uL3Jlc3QvdXNlci9Vc2VyRmlsdGVyU2VhcmNoJ1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSdcbmltcG9ydCB7IHNhdmVBcnIsIHNhdmVTZWxmLCBzdG9yZVVzZXJzIH0gZnJvbSAnLi4vc3RvcmUvdXNlcnMnXG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCB7IEJpdHJpeEFwaVVzZXJNYXBTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL21hcC9yZXN0L3VzZXInXG4vLyBpbXBvcnQgRGF0ZVRyYWNlIGZyb20gJ2J4LXJlc3Qvc2VydmljZXMvYXBpL3RyYWNlL21ldG9kcy9kYXRlJ1xuaW1wb3J0IFNuYWNrQmFyU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9zbmFjay1iYXIvc25hY2stYmFyLnNlcnZpY2UnXG5pbXBvcnQgaUh0dHBBbnN3ZXJCWCBmcm9tICcuLi90eXBpZmljYXRpb24vcmVzdC9iYXNlL2h0dHBBbnN3ZXJCWCdcbmltcG9ydCB7IGlCWFJlc3RVc2VyLCBpQlhSZXN0VXNlckh0dHAsIGlCWFJlc3RVc2VySHR0cEZpZWxkIH0gZnJvbSAnLi4vdHlwaWZpY2F0aW9uL3Jlc3QvdXNlci91c2VyJ1xuaW1wb3J0IHsgJGdldCwgJGxpc3QsICRzZWFyY2gsICR1cGRhdGUsICR1c2VyIH0gZnJvbSAnLi4vY29uc3RzL3BhcnQtbmFtZS1tZXRvZHMnXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IG1hcFJlc3VsdCB9IGZyb20gJy4uL2Z1bmN0aW9ucy9tYXBSZXN1bHQnXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEJYUmVzdFVzZXIge1xuXG4gIHVybCA9IHtcbiAgICBhZG1pbjogWyR1c2VyLCAnYWRtaW4nXSxcbiAgICBnZXQ6IFskdXNlciwgJGdldF0sXG4gICAgY3VycmVudDogWyR1c2VyLCAnY3VycmVudCddLFxuICAgIHVwZGF0ZTogWyR1c2VyLCAkdXBkYXRlXSxcbiAgICBzZWFyY2g6IFskdXNlciwgJHNlYXJjaF0sXG4gICAgYWNjZXNzOiBbJHVzZXIsICdhY2Nlc3MnXSwgLy8gVTEgLSDQv9C+0LvRjNC30L7QstCw0YLQtdC70Ywg0YEgaWQgPTFcbiAgICAvLyBBVSAtINCy0YHQtSDQsNCy0YLQvtGA0LjQt9C+0LLQsNC90L3Ri9C1INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQuFxuICAgIC8vIEQxIC0g0L/QvtC00YDQsNC30LTQtdC70LXQvdC40LUg0YEgaWQ9MVxuICAgIC8vIEcxIC0g0LPRgNGD0L/Qv9CwINGBIGlkPTFcbiAgICBmaWVsZHM6IFskdXNlciwgJ2ZpZWxkcyddLFxuICAgIHVzZXJmaWVsZDoge1xuICAgICAgbGlzdDogWyR1c2VyLCAndXNlcmZpZWxkJywgJGxpc3RdXG4gICAgfVxuICB9XG5cbiAgZGVmOiB7IHBhcmFtczogeyBBQ1RJVkU6IDEsIHN0YXJ0OiAwIH0gfSA9IHtcbiAgICBwYXJhbXM6IHtBQ1RJVkU6IDEsIHN0YXJ0OiAwfVxuICB9XG5cbiAgdXNlciQ6IE9ic2VydmFibGU8c3RvcmVVc2Vycz5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBCWFNlcnZpY2VzLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IFNuYWNrQmFyU2VydmljZSxcbiAgICAvLyBwcml2YXRlIGltZzogSW1nU2VydmljZXMsXG4gICAgLy9wcml2YXRlIGRhdGVUcmFjZTogRGF0ZVRyYWNlLFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlPHsgdXNlcnM6IHN0b3JlVXNlcnMgfT4sXG4gICAgcHJpdmF0ZSB1c2VyTWFwOiBCaXRyaXhBcGlVc2VyTWFwU2VydmljZXMsXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGVcbiAgKSB7XG4gICAgdGhpcy51c2VyJCA9IHRoaXMuc3RvcmUuc2VsZWN0KCd1c2VycycpXG4gIH1cblxuICBhZG1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxpSHR0cEFuc3dlckJYPGJvb2xlYW4+Pih0aGlzLnVybC5hZG1pbilcbiAgfVxuXG4gIGdldChwYXJhbXM6IGlCWEdldFBhcmFtID0ge30pOiBPYnNlcnZhYmxlPGlIdHRwQW5zd2VyQlg8aUJYUmVzdFVzZXJIdHRwW10+IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGNvcHlQYXJhbXMgPSBjbG9uZShwYXJhbXMpXG4gICAgdGhpcy5zZXREZWZQYXJhbShjb3B5UGFyYW1zKVxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxpSHR0cEFuc3dlckJYPGlCWFJlc3RVc2VySHR0cFtdPiB8IHVuZGVmaW5lZD5cbiAgICAodGhpcy51cmwuZ2V0LCBjb3B5UGFyYW1zLCAn0J3QtSDRg9C00LDQu9C+0YHRjCDQv9C+0LvRg9GH0LjRgtGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC5JylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAodiA9PiB7XG4gICAgICAgICAgaWYgKHYgJiYgdi5yZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUFyclVzZXIodi5yZXN1bHQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICB9XG5cbiAgY3VycmVudCh1cGRhdGUgPSBmYWxzZSkge1xuICAgIGlmICh1cGRhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNlbGZIdHRwKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXNlciQucGlwZShcbiAgICAgICAgbWVyZ2VNYXAodiA9PiB7XG4gICAgICAgICAgaWYgKHYgJiYgdi5zZWxmKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Yodi5zZWxmKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTZWxmSHR0cCgpXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgZmlyc3QoKVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZkh0dHAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8aUh0dHBBbnN3ZXJCWDxpQlhSZXN0VXNlckh0dHA+PlxuICAgICh0aGlzLnVybC5jdXJyZW50LCB7fSwgJ9Cd0LUg0YPQtNCw0LvQvtGB0Ywg0L/QvtC70YPRh9C40YLRjCDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y8nKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCh2ID0+IHtcbiAgICAgICAgICBpZiAodiAmJiB2LnJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXNlck1hcC5IdHRwVG9CWCh2LnJlc3VsdClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9KSxcbiAgICAgICAgdGFwKHYgPT4ge1xuICAgICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNhdmVTZWxmKHtzZWxmOiB2fSkpXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIClcbiAgfVxuXG4gIGFjY2VzcyhhY2Nlc3M6IHN0cmluZ1tdLCB0ZXh0RXJyb3IgPSAn0J3QtSDRg9C00LDQu9C+0YHRjCDQv9C+0LvRg9GH0LjRgtGMINC/0YDQsNCy0LAnKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8aUh0dHBBbnN3ZXJCWDxib29sZWFuPiB8IHVuZGVmaW5lZD4odGhpcy51cmwuYWNjZXNzLCB7QUNDRVNTOiBhY2Nlc3N9LCB0ZXh0RXJyb3IpXG4gIH1cblxuICAvLyBnZXRBbGwocGFyYW1zOiBpQlhHZXRQYXJhbSA9IHt9KTogT2JzZXJ2YWJsZTxpQlhSZXN0VXNlciBbXSB8IHVuZGVmaW5lZD4ge1xuICAvLyAgIGlmICghT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGgpIHtcbiAgLy8gICAgIHBhcmFtcyA9IGNsb25lKHRoaXMuZGVmLnBhcmFtcylcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgY29uc3Qgc2F2ZUFsbFVzZXIgPSBjb21wYXJlKHBhcmFtcywgdGhpcy5kZWYucGFyYW1zKVxuICAvLyAgIHJldHVybiB0aGlzLnVzZXIkLnBpcGUoXG4gIC8vICAgICB0YWtlKDEpLFxuICAvLyAgICAgbWVyZ2VNYXAodiA9PiB7XG4gIC8vICAgICAgIGlmICh2LmxvYWQuYWxsKSB7XG4gIC8vICAgICAgICAgaWYgKGNvbXBhcmUodGhpcy5kZWYucGFyYW1zLCBwYXJhbXMpKSB7XG4gIC8vICAgICAgICAgICByZXR1cm4gb2YoY2xvbmUodi5kYXRhKSlcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy9cbiAgLy8gICAgICAgcmV0dXJuIHRoaXMuZ2V0RW5kQXJyYXkocGFyYW1zKS5waXBlKFxuICAvLyAgICAgICAgIHRha2UoMSksXG4gIC8vICAgICAgICAgbWFwKHYgPT4ge1xuICAvLyAgICAgICAgICAgaWYgKHYgJiYgdi5yZXN1bHQpIHtcbiAgLy8gICAgICAgICAgICAgbGV0IGNsID0gY2xvbmUodi5yZXN1bHQpXG4gIC8vICAgICAgICAgICAgIHJldHVybiB0aGlzLnNhdmVBcnJVc2VyKGNsKVxuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAvLyAgICAgICAgIH0pLFxuICAvLyAgICAgICApXG4gIC8vICAgICB9KSxcbiAgLy8gICAgIHRhcCh2ID0+IHtcbiAgLy8gICAgICAgaWYgKHYgJiYgdi5sZW5ndGggJiYgc2F2ZUFsbFVzZXIpIHtcbiAgLy8gICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGxvYWRBbGwoe2xvYWQ6IHRydWV9KSlcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICBwYXJhbXMuc3RhcnQgPSB0aGlzLmRlZi5wYXJhbXMuc3RhcnRcbiAgLy8gICAgIH0pXG4gIC8vICAgKVxuICAvLyB9XG5cbiAgcHJpdmF0ZSBzYXZlQXJyVXNlcih1c2VyczogaUJYUmVzdFVzZXJIdHRwW10pIHtcbiAgICBsZXQgcmVzdWx0OiBpQlhSZXN0VXNlciBbXSA9IFtdXG4gICAgZm9yIChjb25zdCB1c2VyIG9mIHVzZXJzKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLnVzZXJNYXAuSHR0cFRvQlgodXNlcikpXG4gICAgfVxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc2F2ZUFycih7YXJyOiByZXN1bHR9KSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHNlYXJjaChwYXJhbXM6IHN0cmluZyB8IFVzZXJGaWx0ZXJTZWFyY2gpIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBhcmFtcyA9IHtGSU5EOiBwYXJhbXN9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zLkFDVElWRSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBwYXJhbXMuQUNUSVZFID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxpSHR0cEFuc3dlckJYPGlCWFJlc3RVc2VySHR0cFtdPj4oXG4gICAgICB0aGlzLnVybC5zZWFyY2gsXG4gICAgICBwYXJhbXMsXG4gICAgICAn0KHQtdGA0LLQtdGAINC90LUg0L7RgtCy0LXRh9Cw0LXRgiDQvdCwINC30LDQv9GA0L7RgSDQv9C+0LjRgdC60LAnXG4gICAgKVxuICB9XG5cbiAgZmllbGRzKCkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGlIdHRwQW5zd2VyQlg8aUJYUmVzdFVzZXJIdHRwRmllbGQ+Pih0aGlzLnVybC5maWVsZHMpXG4gIH1cblxuICB1cGRhdGUodXNlcjogaUJYUmVzdFVzZXIsIGZpZWxkVXBkYXRlOiBzdHJpbmdbXSkge1xuICAgIGlmIChmaWVsZFVwZGF0ZSAmJiBmaWVsZFVwZGF0ZS5sZW5ndGgpIHtcbiAgICAgIGxldCBzZW5kRGF0YTogYW55ID0ge1xuICAgICAgICBJRDogdXNlci5JRCxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJCWCA9IHRoaXMudXNlck1hcC5CWHRvSHR0cCh1c2VyKVxuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZFVwZGF0ZSkge1xuICAgICAgICBpZiAodXNlckJYW2ZpZWxkXSkge1xuICAgICAgICAgIHNlbmREYXRhW2ZpZWxkXSA9IHVzZXJCWFtmaWVsZF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLmVycm9yKCfQntC00L3QviDQuNC3INGD0LrQsNC30LDQvdC90YvRhSDQv9C+0LvQtdC5INC+0YLQv9GA0LDQstC70LXQvdC+INC90LUg0LLQtdGA0L3QvicpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxpSHR0cEFuc3dlckJYPGlCWFJlc3RVc2VySHR0cFtdPj4oXG4gICAgICAgIHRoaXMudXJsLnVwZGF0ZSwgc2VuZERhdGEsXG4gICAgICAgICfQndC1INGD0LTQsNC70L7RgdGMINC+0LHQvdC+0LLQuNGC0Ywg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPINGBIElEJyArIHVzZXIuSURcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zbmFja0Jhci5lcnJvcign0J3QtSDRg9C60LDQt9Cw0L3QviDQvdC4INC+0LTQvdC+INC/0L7Qu9C1INC00LvRjyDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjycpXG4gICAgICByZXR1cm4gb2Yoe30pXG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0RW5kQXJyYXkocGFyYW1zOiBVc2VyRmlsdGVyID0ge30pOiBPYnNlcnZhYmxlPGlIdHRwQW5zd2VyQlg8aUJYUmVzdFVzZXJIdHRwW10+IHwgdW5kZWZpbmVkPiB7XG4gIC8vICAgcmV0dXJuIHRoaXMuZ2V0KHBhcmFtcykucGlwZShcbiAgLy8gICAgIG1lcmdlTWFwKGl0ZW1zID0+IHtcbiAgLy8gICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLnJlc3VsdCAmJiB0eXBlb2YgaXRlbXMucmVzdWx0ID09PSAnb2JqZWN0Jykge1xuICAvLyAgICAgICAgIGlmIChpdGVtcy5uZXh0KSB7XG4gIC8vICAgICAgICAgICBwYXJhbXMuc3RhcnQgPSBpdGVtcy5uZXh0XG4gIC8vICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFbmRBcnJheShwYXJhbXMpLnBpcGUobWFwKHZFbmQgPT4ge1xuICAvLyAgICAgICAgICAgICBpZiAodkVuZCAmJiBpdGVtcy5yZXN1bHQgJiYgdkVuZC5yZXN1bHQpIHtcbiAgLy8gICAgICAgICAgICAgICByZXR1cm4ge3Jlc3VsdDogWy4uLml0ZW1zLnJlc3VsdCwgLi4udkVuZC5yZXN1bHRdfVxuICAvLyAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICAgIHJldHVybiAoaXRlbXMpID8gaXRlbXMgOiB1bmRlZmluZWRcbiAgLy8gICAgICAgICAgIH0pKVxuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgICByZXR1cm4gb2YoaXRlbXMpXG4gIC8vICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZClcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSksXG4gIC8vICAgKVxuICAvLyB9XG5cbiAgIHByaXZhdGUgc2V0RGVmUGFyYW0ocGFyYW1zOiBpQlhHZXRQYXJhbSkge1xuICAgIGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KCdBQ1RJVkUnKSkge1xuICAgICAgcGFyYW1zLkFDVElWRSA9IHRoaXMuZGVmLnBhcmFtcy5BQ1RJVkVcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5BQ1RJVkUgJiYgcGFyYW1zLkFDVElWRSA9PT0gMikge1xuICAgICAgZGVsZXRlIHBhcmFtcy5BQ1RJVkVcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuaGFzT3duUHJvcGVydHkoJ3N0YXJ0JykpIHtcbiAgICAgIHBhcmFtcy5zdGFydCA9IHRoaXMuZGVmLnBhcmFtcy5zdGFydFxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuVUZfREVQQVJUTUVOVCAmJiAhcGFyYW1zLlVGX0RFUEFSVE1FTlQubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgcGFyYW1zLlVGX0RFUEFSVE1FTlRcbiAgICB9XG4gIH1cbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQlhSZXN0VXNlclJlcyBleHRlbmRzIG5ldyBQcm94eShCWFJlc3RVc2VyLCB7XG4gIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgY29uc3QgcmVzID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcilcbiAgICBpZihyZXMgaW4gT2JzZXJ2YWJsZSl7XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikucGlwZShcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtYXAodiA9PiBtYXBSZXN1bHQodikpXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xuICB9XG59KXt9XG5cbiJdfQ==
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { time } from '../consts/time';
|
|
3
|
-
// import { environment } from 'bx-rest/environments/environment'
|
|
4
|
-
import { DateTime } from 'luxon';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class BaseServices {
|
|
7
|
-
toStr(val) {
|
|
8
|
-
return (val) ? String(val) : '';
|
|
9
|
-
}
|
|
10
|
-
toNum(val) {
|
|
11
|
-
return (val && Number(val)) ? Number(val) : 0;
|
|
12
|
-
}
|
|
13
|
-
toDate(val, format, opt) {
|
|
14
|
-
if (val instanceof Date) {
|
|
15
|
-
return val;
|
|
16
|
-
}
|
|
17
|
-
else if (typeof val == 'string') {
|
|
18
|
-
if (format) {
|
|
19
|
-
if (opt) {
|
|
20
|
-
return DateTime.fromFormat(val, format, opt).toJSDate();
|
|
21
|
-
}
|
|
22
|
-
return DateTime.fromFormat(val, format).toJSDate();
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return new Date(val);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
else if (typeof val == 'number') {
|
|
29
|
-
return new Date(val);
|
|
30
|
-
}
|
|
31
|
-
console.error('Wrong date format', val, format);
|
|
32
|
-
throw 'Wrong date format';
|
|
33
|
-
}
|
|
34
|
-
getBXStrTime(date) {
|
|
35
|
-
return this.toISOStringWithTimezone(date);
|
|
36
|
-
}
|
|
37
|
-
toISOStringWithTimezone(date) {
|
|
38
|
-
const tzOffset = -date.getTimezoneOffset();
|
|
39
|
-
const diff = tzOffset >= 0 ? '+' : '-';
|
|
40
|
-
const pad = (n) => `${Math.floor(Math.abs(n))}`.padStart(2, '0');
|
|
41
|
-
return date.getFullYear() +
|
|
42
|
-
'-' + pad(date.getMonth() + 1) +
|
|
43
|
-
'-' + pad(date.getDate()) +
|
|
44
|
-
'T' + pad(date.getHours()) +
|
|
45
|
-
':' + pad(date.getMinutes()) +
|
|
46
|
-
':' + pad(date.getSeconds()) +
|
|
47
|
-
diff + pad(tzOffset / 60) +
|
|
48
|
-
':' + pad(tzOffset % 60);
|
|
49
|
-
}
|
|
50
|
-
;
|
|
51
|
-
toBool(val) {
|
|
52
|
-
switch (typeof val) {
|
|
53
|
-
case 'string':
|
|
54
|
-
val = val.toLowerCase();
|
|
55
|
-
if (val === 'n' || val === 'y') { // битриксовые понятия о bool
|
|
56
|
-
return val === 'y';
|
|
57
|
-
}
|
|
58
|
-
else if (val === 'true' || val === 'false') { // битриксовые понятия о bool
|
|
59
|
-
return val === 'true';
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
default:
|
|
65
|
-
return Boolean(val);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
toBXYorN(val) {
|
|
69
|
-
return (val) ? 'Y' : 'N';
|
|
70
|
-
}
|
|
71
|
-
typeof(val) {
|
|
72
|
-
return typeof val;
|
|
73
|
-
}
|
|
74
|
-
typeDefClass(val) {
|
|
75
|
-
if (val) {
|
|
76
|
-
if (val instanceof Date) {
|
|
77
|
-
return 'date';
|
|
78
|
-
}
|
|
79
|
-
return undefined;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
toJSON(val) {
|
|
86
|
-
return JSON.stringify(val);
|
|
87
|
-
}
|
|
88
|
-
fromJSON(val) {
|
|
89
|
-
return JSON.parse(val);
|
|
90
|
-
}
|
|
91
|
-
prepareBaseAddress(url, add = '') {
|
|
92
|
-
if (url.search('https://') !== 0 && url.search('http://')) {
|
|
93
|
-
url = 'https://' + url;
|
|
94
|
-
}
|
|
95
|
-
if (url.lastIndexOf('/') !== (url.length - 1)) {
|
|
96
|
-
url = url + '/';
|
|
97
|
-
}
|
|
98
|
-
url = url + add;
|
|
99
|
-
return url;
|
|
100
|
-
}
|
|
101
|
-
getHomeAddress() {
|
|
102
|
-
// return this.prepareBaseAddress(environment.urls.home)
|
|
103
|
-
return this.prepareBaseAddress('b24.trace-studio.com');
|
|
104
|
-
}
|
|
105
|
-
dateDiff(a, b) {
|
|
106
|
-
return new Date(a.valueOf() - b.valueOf());
|
|
107
|
-
}
|
|
108
|
-
dateDiffInDays(a, b) {
|
|
109
|
-
return Math.floor(this.dateDiff(a, b).valueOf() / time.oneDayMilliseconds);
|
|
110
|
-
}
|
|
111
|
-
getBase64File(file) {
|
|
112
|
-
return new Promise((resolve, reject) => {
|
|
113
|
-
const reader = new FileReader();
|
|
114
|
-
reader.readAsDataURL(file);
|
|
115
|
-
reader.onload = () => resolve(reader.result);
|
|
116
|
-
reader.onerror = error => reject(error);
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
async getBase64FileLikeStr(file) {
|
|
120
|
-
let result = await this.getBase64File(file);
|
|
121
|
-
if (typeof result === 'string') {
|
|
122
|
-
let split = result.split(',');
|
|
123
|
-
return {
|
|
124
|
-
header: split[0],
|
|
125
|
-
val: split[1]
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
|
-
sumArray(numbers) {
|
|
131
|
-
return numbers.reduce((a, b) => {
|
|
132
|
-
return a + b;
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
isItTheSameDate(date1, date2) {
|
|
136
|
-
return date1.getDate() === date2.getDate()
|
|
137
|
-
&& date1.getMonth() === date2.getMonth()
|
|
138
|
-
&& date1.getFullYear() === date2.getFullYear();
|
|
139
|
-
}
|
|
140
|
-
toUnix(date) {
|
|
141
|
-
return Math.floor(date.valueOf() / 1000);
|
|
142
|
-
}
|
|
143
|
-
arrSum(x) {
|
|
144
|
-
let s = 0;
|
|
145
|
-
for (let i = 0; i < x.length; i++) {
|
|
146
|
-
s += x[i];
|
|
147
|
-
}
|
|
148
|
-
return s;
|
|
149
|
-
}
|
|
150
|
-
getBaseUrlHttps(url, component = false) {
|
|
151
|
-
if (component) {
|
|
152
|
-
return encodeURI(this.cropUrl(url) + '/');
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
return encodeURI('https://' + this.cropUrl(url) + '/');
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
cropUrl(url) {
|
|
159
|
-
url = (url) ? url.replace('https://', '') : '';
|
|
160
|
-
url = (url) ? url.replace('http://', '') : '';
|
|
161
|
-
url = (url) ? url.replace('https:', '') : '';
|
|
162
|
-
url = (url) ? url.replace('http:', '') : '';
|
|
163
|
-
return url;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
BaseServices.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseServices, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
167
|
-
BaseServices.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseServices, providedIn: 'root' });
|
|
168
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: BaseServices, decorators: [{
|
|
169
|
-
type: Injectable,
|
|
170
|
-
args: [{
|
|
171
|
-
providedIn: 'root'
|
|
172
|
-
}]
|
|
173
|
-
}] });
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2J4LXJlc3Qvc3JjL3NlcnZpY2VzL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDckMsaUVBQWlFO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUE7O0FBTWhDLE1BQU0sT0FBTyxZQUFZO0lBRXJCLEtBQUssQ0FBQyxHQUFRO1FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQVE7UUFDVixPQUFPLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQTJCLEVBQUUsTUFBZSxFQUFFLEdBQXFCO1FBQ3RFLElBQUksR0FBRyxZQUFZLElBQUksRUFBRTtZQUNyQixPQUFPLEdBQUcsQ0FBQTtTQUNiO2FBQU0sSUFBSSxPQUFPLEdBQUcsSUFBSSxRQUFRLEVBQUU7WUFDL0IsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsSUFBSSxHQUFHLEVBQUU7b0JBQ0wsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7aUJBQzFEO2dCQUNELE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7YUFDckQ7aUJBQU07Z0JB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QUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUM1QyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUMzQyxPQUFPLEdBQUcsQ0FBQTtJQUNkLENBQUM7O3lHQWhMUSxZQUFZOzZHQUFaLFlBQVksY0FGVCxNQUFNOzJGQUVULFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IHRpbWUgfSBmcm9tICcuLi9jb25zdHMvdGltZSdcclxuLy8gaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICdieC1yZXN0L2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCdcclxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbidcclxuaW1wb3J0IHsgRGF0ZVRpbWVPcHRpb25zIH0gZnJvbSAnbHV4b24vc3JjL2RhdGV0aW1lJ1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlU2VydmljZXMge1xyXG5cclxuICAgIHRvU3RyKHZhbDogYW55KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gKHZhbCkgPyBTdHJpbmcodmFsKSA6ICcnXHJcbiAgICB9XHJcblxyXG4gICAgdG9OdW0odmFsOiBhbnkpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiAodmFsICYmIE51bWJlcih2YWwpKSA/IE51bWJlcih2YWwpIDogMFxyXG4gICAgfVxyXG5cclxuICAgIHRvRGF0ZSh2YWw6IG51bWJlciB8IHN0cmluZyB8IERhdGUsIGZvcm1hdD86IHN0cmluZywgb3B0PzogRGF0ZVRpbWVPcHRpb25zKTogRGF0ZSB7XHJcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbFxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXQodmFsLCBmb3JtYXQsIG9wdCkudG9KU0RhdGUoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXQodmFsLCBmb3JtYXQpLnRvSlNEYXRlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWwpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbClcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignV3JvbmcgZGF0ZSBmb3JtYXQnLCB2YWwsIGZvcm1hdClcclxuICAgICAgICB0aHJvdyAnV3JvbmcgZGF0ZSBmb3JtYXQnXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QlhTdHJUaW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nV2l0aFRpbWV6b25lKGRhdGUpXHJcbiAgICB9XHJcblxyXG4gICAgdG9JU09TdHJpbmdXaXRoVGltZXpvbmUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdHpPZmZzZXQgPSAtZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpXHJcbiAgICAgICAgY29uc3QgZGlmZiA9IHR6T2Zmc2V0ID49IDAgPyAnKycgOiAnLSdcclxuICAgICAgICBjb25zdCBwYWQgPSAobjogbnVtYmVyKSA9PiBgJHtNYXRoLmZsb29yKE1hdGguYWJzKG4pKX1gLnBhZFN0YXJ0KDIsICcwJylcclxuICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpICtcclxuICAgICAgICAgICAgJy0nICsgcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpICtcclxuICAgICAgICAgICAgJy0nICsgcGFkKGRhdGUuZ2V0RGF0ZSgpKSArXHJcbiAgICAgICAgICAgICdUJyArIHBhZChkYXRlLmdldEhvdXJzKCkpICtcclxuICAgICAgICAgICAgJzonICsgcGFkKGRhdGUuZ2V0TWludXRlcygpKSArXHJcbiAgICAgICAgICAgICc6JyArIHBhZChkYXRlLmdldFNlY29uZHMoKSkgK1xyXG4gICAgICAgICAgICBkaWZmICsgcGFkKHR6T2Zmc2V0IC8gNjApICtcclxuICAgICAgICAgICAgJzonICsgcGFkKHR6T2Zmc2V0ICUgNjApXHJcbiAgICB9O1xyXG5cclxuICAgIHRvQm9vbCh2YWw6IGFueSkge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbCkge1xyXG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxyXG4gICAgICAgICAgICAgICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT09ICduJyB8fCB2YWwgPT09ICd5JykgeyAvLyDQsdC40YLRgNC40LrRgdC+0LLRi9C1INC/0L7QvdGP0YLQuNGPINC+IGJvb2xcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsID09PSAneSdcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsID09PSAndHJ1ZScgfHwgdmFsID09PSAnZmFsc2UnKSB7IC8vINCx0LjRgtGA0LjQutGB0L7QstGL0LUg0L/QvtC90Y/RgtC40Y8g0L4gYm9vbFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwgPT09ICd0cnVlJ1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHZhbClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdG9CWFlvck4odmFsOiBib29sZWFuKSB7XHJcbiAgICAgICAgcmV0dXJuICh2YWwpID8gJ1knIDogJ04nXHJcbiAgICB9XHJcblxyXG4gICAgdHlwZW9mKHZhbDogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWxcclxuICAgIH1cclxuXHJcbiAgICB0eXBlRGVmQ2xhc3ModmFsOiBvYmplY3QpOiB1bmRlZmluZWQgfCBudWxsIHwgJ2RhdGUnIHtcclxuICAgICAgICBpZiAodmFsKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RhdGUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRvSlNPTih2YWw6IG9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWwpXHJcbiAgICB9XHJcblxyXG4gICAgZnJvbUpTT048VD4odmFsOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWwpXHJcbiAgICB9XHJcblxyXG4gICAgcHJlcGFyZUJhc2VBZGRyZXNzKHVybDogc3RyaW5nLCBhZGQ6IHN0cmluZyA9ICcnKSB7XHJcbiAgICAgICAgaWYgKHVybC5zZWFyY2goJ2h0dHBzOi8vJykgIT09IDAgJiYgdXJsLnNlYXJjaCgnaHR0cDovLycpKSB7XHJcbiAgICAgICAgICAgIHVybCA9ICdodHRwczovLycgKyB1cmxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh1cmwubGFzdEluZGV4T2YoJy8nKSAhPT0gKHVybC5sZW5ndGggLSAxKSkge1xyXG4gICAgICAgICAgICB1cmwgPSB1cmwgKyAnLydcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVybCA9IHVybCArIGFkZFxyXG5cclxuICAgICAgICByZXR1cm4gdXJsXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SG9tZUFkZHJlc3MoKSB7XHJcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMucHJlcGFyZUJhc2VBZGRyZXNzKGVudmlyb25tZW50LnVybHMuaG9tZSlcclxuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQmFzZUFkZHJlc3MoJ2IyNC50cmFjZS1zdHVkaW8uY29tJylcclxuICAgIH1cclxuXHJcbiAgICBkYXRlRGlmZihhOiBEYXRlLCBiOiBEYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGEudmFsdWVPZigpIC0gYi52YWx1ZU9mKCkpXHJcbiAgICB9XHJcblxyXG4gICAgZGF0ZURpZmZJbkRheXMoYTogRGF0ZSwgYjogRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMuZGF0ZURpZmYoYSwgYikudmFsdWVPZigpIC8gdGltZS5vbmVEYXlNaWxsaXNlY29uZHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJhc2U2NEZpbGUoZmlsZTogRmlsZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSlcclxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdClcclxuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRCYXNlNjRGaWxlTGlrZVN0cihmaWxlOiBGaWxlKTogUHJvbWlzZTx7IGhlYWRlcjogc3RyaW5nLCB2YWw6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0QmFzZTY0RmlsZShmaWxlKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBsZXQgc3BsaXQgPSByZXN1bHQuc3BsaXQoJywnKVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBzcGxpdFswXSxcclxuICAgICAgICAgICAgICAgIHZhbDogc3BsaXRbMV1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICB9XHJcblxyXG4gICAgc3VtQXJyYXkobnVtYmVyczogbnVtYmVyW10pIHtcclxuICAgICAgICByZXR1cm4gbnVtYmVycy5yZWR1Y2UoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGEgKyBiO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgaXNJdFRoZVNhbWVEYXRlKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBkYXRlMS5nZXREYXRlKCkgPT09IGRhdGUyLmdldERhdGUoKVxyXG4gICAgICAgICAgICAmJiBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpXHJcbiAgICAgICAgICAgICYmIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKClcclxuICAgIH1cclxuXHJcbiAgICB0b1VuaXgoZGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKGRhdGUudmFsdWVPZigpIC8gMTAwMClcclxuICAgIH1cclxuXHJcbiAgICBhcnJTdW0oeDogbnVtYmVyW10pIHtcclxuICAgICAgICBsZXQgcyA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgKz0geFtpXVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJhc2VVcmxIdHRwcyh1cmw6IHN0cmluZywgY29tcG9uZW50ID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUkkodGhpcy5jcm9wVXJsKHVybCkgKyAnLycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUkkoJ2h0dHBzOi8vJyArIHRoaXMuY3JvcFVybCh1cmwpICsgJy8nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JvcFVybCh1cmw6IHN0cmluZykge1xyXG4gICAgICAgIHVybCA9ICh1cmwpID8gdXJsLnJlcGxhY2UoJ2h0dHBzOi8vJywgJycpIDogJydcclxuICAgICAgICB1cmwgPSAodXJsKSA/IHVybC5yZXBsYWNlKCdodHRwOi8vJywgJycpIDogJydcclxuICAgICAgICB1cmwgPSAodXJsKSA/IHVybC5yZXBsYWNlKCdodHRwczonLCAnJykgOiAnJ1xyXG4gICAgICAgIHVybCA9ICh1cmwpID8gdXJsLnJlcGxhY2UoJ2h0dHA6JywgJycpIDogJydcclxuICAgICAgICByZXR1cm4gdXJsXHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { throwError, take, mergeMap, forkJoin } from 'rxjs';
|
|
2
|
-
import { catchError, map } from 'rxjs/operators';
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import clone from 'just-clone';
|
|
5
|
-
import BaseHttpServices from '../../services/http/http';
|
|
6
|
-
import flatten from 'just-flatten-it';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
export default class HttpBXServices extends BaseHttpServices {
|
|
9
|
-
timeNowOnServer() {
|
|
10
|
-
return this.httpGet('server.time').pipe(map(v => {
|
|
11
|
-
if (v && v.result) {
|
|
12
|
-
return new Date(v.result);
|
|
13
|
-
}
|
|
14
|
-
return undefined;
|
|
15
|
-
}));
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Это пиздец а не метод
|
|
19
|
-
* @param param
|
|
20
|
-
*/
|
|
21
|
-
branch(param) {
|
|
22
|
-
let prepareParam = Object.entries(this.prepareBatch(param));
|
|
23
|
-
const size = 50; // больше не отдаст
|
|
24
|
-
let subarray = []; //массив в который будет выведен результат.
|
|
25
|
-
for (let i = 0; i < Math.ceil(prepareParam.length / size); i++) {
|
|
26
|
-
subarray[i] = prepareParam.slice((i * size), (i * size) + size);
|
|
27
|
-
}
|
|
28
|
-
return forkJoin(subarray.map(i => {
|
|
29
|
-
return this.httpPost('batch.json', {
|
|
30
|
-
halt: 0,
|
|
31
|
-
cmd: Object.assign({}, ...i.map(x => {
|
|
32
|
-
return { [x[0]]: x[1] };
|
|
33
|
-
}))
|
|
34
|
-
});
|
|
35
|
-
}));
|
|
36
|
-
}
|
|
37
|
-
prepareBatch(param) {
|
|
38
|
-
let res = Object.keys(param).reduce((obj, key) => {
|
|
39
|
-
obj[key] = '';
|
|
40
|
-
return obj;
|
|
41
|
-
}, {});
|
|
42
|
-
for (let key in param) {
|
|
43
|
-
if (typeof key === 'string' || typeof key === 'number' && param[key].param) {
|
|
44
|
-
res[key] = param[key].name + '?' + this.getHttpParamsGet(param[key].param).toString();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return res;
|
|
48
|
-
}
|
|
49
|
-
mapBranchResult(res) {
|
|
50
|
-
return Object.assign([], ...res.map(i => (i.result && i.result.result) ? i.result.result : undefined));
|
|
51
|
-
}
|
|
52
|
-
mapBranchResultWithoutKey(res) {
|
|
53
|
-
return flatten(Object.assign([], ...res.map(i => (i.result && i.result.result) ? i.result.result : undefined)));
|
|
54
|
-
}
|
|
55
|
-
post(name, params = {}, textError = '', settings = this.defSettings) {
|
|
56
|
-
return this.httpPost(this.getNameMethod(name), params, textError, settings);
|
|
57
|
-
}
|
|
58
|
-
get(name, params = {}, textError = '', settings = this.defSettings) {
|
|
59
|
-
return this.httpGet(this.getNameMethod(name), params, textError, settings);
|
|
60
|
-
}
|
|
61
|
-
httpPost(url, params = {}, textError = '', settings = this.defSettings) {
|
|
62
|
-
return this.session.getAuthParams().pipe(mergeMap(auth => {
|
|
63
|
-
if (auth) {
|
|
64
|
-
const paramsClone = clone(params);
|
|
65
|
-
paramsClone[this.session.getKeyAuth()] = auth;
|
|
66
|
-
return this.session.getBaseUrl().pipe(mergeMap(v => {
|
|
67
|
-
if (v) {
|
|
68
|
-
return this.http.post(this.prepareBaseAddress(v) + url, this.getHttpParamsPost(paramsClone, new FormData(), false, [], settings))
|
|
69
|
-
.pipe(take(1), catchError(err => {
|
|
70
|
-
if (!textError.length && err.error.error_description) {
|
|
71
|
-
textError = err.error.error_description;
|
|
72
|
-
}
|
|
73
|
-
this.snackBar.error('Ошибка: ' + textError);
|
|
74
|
-
return throwError(() => err);
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
return throwError(() => 'get base url error');
|
|
78
|
-
}));
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
this.snackBar.error('Error: Auth not get');
|
|
82
|
-
return throwError(() => 'auth not get');
|
|
83
|
-
}
|
|
84
|
-
}));
|
|
85
|
-
}
|
|
86
|
-
httpGet(url, params = {}, textError = '', settings = this.defSettings) {
|
|
87
|
-
return this.session.getAuthParams().pipe(mergeMap(auth => {
|
|
88
|
-
if (auth) {
|
|
89
|
-
if (params === null) {
|
|
90
|
-
params = {};
|
|
91
|
-
}
|
|
92
|
-
const paramsClone = clone(params);
|
|
93
|
-
paramsClone[this.session.getKeyAuth()] = auth;
|
|
94
|
-
let options = {
|
|
95
|
-
params: this.getHttpParamsGet(paramsClone)
|
|
96
|
-
};
|
|
97
|
-
return this.session.getBaseUrl().pipe(mergeMap(v => {
|
|
98
|
-
if (v) {
|
|
99
|
-
return this.http.get(this.prepareBaseAddress(v) + url, options).pipe(take(1), catchError(err => {
|
|
100
|
-
if (!textError.length && err.error.error_description) {
|
|
101
|
-
textError = err.error.error_description;
|
|
102
|
-
}
|
|
103
|
-
this.snackBar.error('Ошибка: ' + textError);
|
|
104
|
-
return throwError(() => err);
|
|
105
|
-
}));
|
|
106
|
-
}
|
|
107
|
-
return throwError(() => 'get base url error');
|
|
108
|
-
}));
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
this.snackBar.error('Error: Auth not get');
|
|
112
|
-
return throwError(() => 'auth not get');
|
|
113
|
-
}
|
|
114
|
-
}));
|
|
115
|
-
}
|
|
116
|
-
getNameMethod(arr) {
|
|
117
|
-
return arr.join('.');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
HttpBXServices.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HttpBXServices, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
121
|
-
HttpBXServices.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HttpBXServices, providedIn: 'root' });
|
|
122
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: HttpBXServices, decorators: [{
|
|
123
|
-
type: Injectable,
|
|
124
|
-
args: [{
|
|
125
|
-
providedIn: 'root'
|
|
126
|
-
}]
|
|
127
|
-
}] });
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cEJYLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYngtcmVzdC9zcmMvc2VydmljZXMvaHR0cC9IdHRwQlgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBRTlCLE9BQU8sZ0JBQWdCLE1BQU0sMEJBQTBCLENBQUE7QUFNdkQsT0FBTyxPQUFPLE1BQU0saUJBQWlCLENBQUE7O0FBS3JDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sY0FBZSxTQUFRLGdCQUFnQjtJQUVqRCxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBb0MsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUN4RSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUNqQixPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTthQUMxQjtZQUNELE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ00sTUFBTSxDQUFPLEtBQXlEO1FBQzdFLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQVMsSUFBSSxDQUFDLFlBQVksQ0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQSxDQUFDLG1CQUFtQjtRQUNuQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUEsQ0FBQywyQ0FBMkM7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Y0FBYzsrR0FBZCxjQUFjLGNBRnJCLE1BQU07MkZBRUMsY0FBYztrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yLCB0YWtlLCBtZXJnZU1hcCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCBjbG9uZSBmcm9tICdqdXN0LWNsb25lJ1xuaW1wb3J0IHsgaUh0dHBQYXJhbVNldHRpbmdzIH0gZnJvbSAnLi4vLi4vdHlwaWZpY2F0aW9uL3Jlc3Qvc2V0dGluZ3MnXG5pbXBvcnQgQmFzZUh0dHBTZXJ2aWNlcyBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL2h0dHAnXG5pbXBvcnQge1xuICBpQmF0Y2hSZXF1ZXN0QW5zd2VyLCBpQmF0Y2hSZXF1ZXN0UGFyYW0sXG4gIGlCYXRjaFJlcXVlc3RQYXJhbUFycixcbiAgaUJhdGNoUmVxdWVzdFBhcmFtSHR0cCwga2V5QmF0Y2hcbn0gZnJvbSAnLi4vLi4vdHlwaWZpY2F0aW9uL3Jlc3QvYmF0Y2gvYmF0Y2hSZXF1ZXN0UGFyYW0nXG5pbXBvcnQgZmxhdHRlbiBmcm9tICdqdXN0LWZsYXR0ZW4taXQnXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSHR0cEJYU2VydmljZXMgZXh0ZW5kcyBCYXNlSHR0cFNlcnZpY2VzIHtcblxuICBvdmVycmlkZSB0aW1lTm93T25TZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cEdldDx7IHJlc3VsdD86IERhdGUsIGVycm9yPzogc3RyaW5nIH0+KCdzZXJ2ZXIudGltZScpLnBpcGUoXG4gICAgICBtYXAodiA9PiB7XG4gICAgICAgIGlmICh2ICYmIHYucmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHYucmVzdWx0KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH0pLFxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiDQrdGC0L4g0L/QuNC30LTQtdGGINCwINC90LUg0LzQtdGC0L7QtFxuICAgKiBAcGFyYW0gcGFyYW1cbiAgICovXG4gIG92ZXJyaWRlIGJyYW5jaDxULCBBPihwYXJhbTogaUJhdGNoUmVxdWVzdFBhcmFtQXJyPFQ+IHwgaUJhdGNoUmVxdWVzdFBhcmFtPFQ+W10pOiBPYnNlcnZhYmxlPGlCYXRjaFJlcXVlc3RBbnN3ZXI8QT5bXSB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBwcmVwYXJlUGFyYW0gPSBPYmplY3QuZW50cmllczxzdHJpbmc+KHRoaXMucHJlcGFyZUJhdGNoPFQ+KHBhcmFtKSlcbiAgICBjb25zdCBzaXplID0gNTAgLy8g0LHQvtC70YzRiNC1INC90LUg0L7RgtC00LDRgdGCXG4gICAgbGV0IHN1YmFycmF5ID0gW10gLy/QvNCw0YHRgdC40LIg0LIg0LrQvtGC0L7RgNGL0Lkg0LHRg9C00LXRgiDQstGL0LLQtdC00LXQvSDRgNC10LfRg9C70YzRgtCw0YIuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLmNlaWwocHJlcGFyZVBhcmFtLmxlbmd0aCAvIHNpemUpOyBpKyspIHtcbiAgICAgIHN1YmFycmF5W2ldID0gcHJlcGFyZVBhcmFtLnNsaWNlKChpICogc2l6ZSksIChpICogc2l6ZSkgKyBzaXplKVxuICAgIH1cblxuICAgIHJldHVybiBmb3JrSm9pbihcbiAgICAgIHN1YmFycmF5Lm1hcChpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFBvc3QoJ2JhdGNoLmpzb24nLCB7XG4gICAgICAgICAgaGFsdDogMCxcbiAgICAgICAgICBjbWQ6IE9iamVjdC5hc3NpZ24oe30sIC4uLmkubWFwKHggPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtbeFswXV06IHhbMV19XG4gICAgICAgICAgfSkpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICkgYXMgT2JzZXJ2YWJsZTxpQmF0Y2hSZXF1ZXN0QW5zd2VyPEE+W10+XG4gIH1cblxuICBvdmVycmlkZSBwcmVwYXJlQmF0Y2g8VD4ocGFyYW06IGlCYXRjaFJlcXVlc3RQYXJhbUFycjxUPiB8IGlCYXRjaFJlcXVlc3RQYXJhbTxUPltdKTogaUJhdGNoUmVxdWVzdFBhcmFtSHR0cCB7XG4gICAgbGV0IHJlczogaUJhdGNoUmVxdWVzdFBhcmFtSHR0cCA9IE9iamVjdC5rZXlzKHBhcmFtKS5yZWR1Y2UoXG4gICAgICAob2JqLCBrZXkpID0+IHtcbiAgICAgICAgb2JqW2tleV0gPSAnJztcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0sXG4gICAgICB7fSBhcyBpQmF0Y2hSZXF1ZXN0UGFyYW1IdHRwXG4gICAgKTtcbiAgICBmb3IgKGxldCBrZXkgaW4gcGFyYW0pIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyAmJiBwYXJhbVtrZXldLnBhcmFtKSB7XG4gICAgICAgIHJlc1trZXldID0gcGFyYW1ba2V5XS5uYW1lICsgJz8nICsgdGhpcy5nZXRIdHRwUGFyYW1zR2V0KHBhcmFtW2tleV0ucGFyYW0pLnRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgb3ZlcnJpZGUgbWFwQnJhbmNoUmVzdWx0PFQ+KHJlczogaUJhdGNoUmVxdWVzdEFuc3dlcjxUPltdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oW10sIC4uLnJlcy5tYXAoaSA9PiAoaS5yZXN1bHQgJiYgaS5yZXN1bHQucmVzdWx0KSA/IGkucmVzdWx0LnJlc3VsdCA6IHVuZGVmaW5lZCkpIGFzIHtcbiAgICAgIFtrZXk6IGtleUJhdGNoXTogVFxuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG1hcEJyYW5jaFJlc3VsdFdpdGhvdXRLZXk8VD4ocmVzOiBpQmF0Y2hSZXF1ZXN0QW5zd2VyPFQ+W10pOiBUW10ge1xuICAgIHJldHVybiBmbGF0dGVuPFQ+KE9iamVjdC5hc3NpZ24oW10sIC4uLnJlcy5tYXAoaSA9PiAoaS5yZXN1bHQgJiYgaS5yZXN1bHQucmVzdWx0KSA/IGkucmVzdWx0LnJlc3VsdCA6IHVuZGVmaW5lZCkpKVxuICB9XG5cbiAgb3ZlcnJpZGUgcG9zdDxUPihuYW1lOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGFueSA9IHt9LFxuICAgICAgICAgICAgICAgICAgIHRleHRFcnJvciA9ICcnLFxuICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBpSHR0cFBhcmFtU2V0dGluZ3MgPSB0aGlzLmRlZlNldHRpbmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFBvc3Q8VD4odGhpcy5nZXROYW1lTWV0aG9kKG5hbWUpLCBwYXJhbXMsIHRleHRFcnJvciwgc2V0dGluZ3MpXG4gIH1cblxuICBvdmVycmlkZSBnZXQ8VD4obmFtZTogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICBwYXJhbXM6IGFueSA9IHt9LFxuICAgICAgICAgICAgICAgICAgdGV4dEVycm9yID0gJycsXG4gICAgICAgICAgICAgICAgICBzZXR0aW5nczogaUh0dHBQYXJhbVNldHRpbmdzID0gdGhpcy5kZWZTZXR0aW5ncykge1xuICAgIHJldHVybiB0aGlzLmh0dHBHZXQ8VD4odGhpcy5nZXROYW1lTWV0aG9kKG5hbWUpLCBwYXJhbXMsIHRleHRFcnJvciwgc2V0dGluZ3MpXG4gIH1cblxuICBvdmVycmlkZSBodHRwUG9zdDxUPih1cmw6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBhbnkgPSB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVycm9yID0gJycsXG4gICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBpSHR0cFBhcmFtU2V0dGluZ3MgPSB0aGlzLmRlZlNldHRpbmdzXG4gICk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0QXV0aFBhcmFtcygpLnBpcGUoXG4gICAgICBtZXJnZU1hcChhdXRoID0+IHtcbiAgICAgICAgaWYgKGF1dGgpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbXNDbG9uZSA9IGNsb25lKHBhcmFtcylcbiAgICAgICAgICBwYXJhbXNDbG9uZVt0aGlzLnNlc3Npb24uZ2V0S2V5QXV0aCgpXSA9IGF1dGhcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldEJhc2VVcmwoKS5waXBlKG1lcmdlTWFwKHYgPT4ge1xuICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFQgfCB1bmRlZmluZWQ+KFxuICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZUJhc2VBZGRyZXNzKHYpICsgdXJsLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0SHR0cFBhcmFtc1Bvc3QocGFyYW1zQ2xvbmUsIG5ldyBGb3JtRGF0YSgpLCBmYWxzZSwgW10sIHNldHRpbmdzKSlcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGV4dEVycm9yLmxlbmd0aCAmJiBlcnIuZXJyb3IuZXJyb3JfZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0RXJyb3IgPSBlcnIuZXJyb3IuZXJyb3JfZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIuZXJyb3IoJ9Ce0YjQuNCx0LrQsDogJyArIHRleHRFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAnZ2V0IGJhc2UgdXJsIGVycm9yJylcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLmVycm9yKCdFcnJvcjogQXV0aCBub3QgZ2V0JylcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAnYXV0aCBub3QgZ2V0JylcbiAgICAgICAgfVxuICAgICAgfSkpXG4gIH1cblxuICBvdmVycmlkZSBodHRwR2V0PFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIHBhcmFtczogYW55ID0ge30sXG4gICAgdGV4dEVycm9yID0gJycsXG4gICAgc2V0dGluZ3M6IGlIdHRwUGFyYW1TZXR0aW5ncyA9IHRoaXMuZGVmU2V0dGluZ3NcbiAgKTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRBdXRoUGFyYW1zKCkucGlwZShcbiAgICAgIG1lcmdlTWFwKGF1dGggPT4ge1xuICAgICAgICBpZiAoYXV0aCkge1xuICAgICAgICAgIGlmIChwYXJhbXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHt9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHBhcmFtc0Nsb25lID0gY2xvbmUocGFyYW1zKVxuICAgICAgICAgIHBhcmFtc0Nsb25lW3RoaXMuc2Vzc2lvbi5nZXRLZXlBdXRoKCldID0gYXV0aFxuICAgICAgICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICAgICAgcGFyYW1zOiB0aGlzLmdldEh0dHBQYXJhbXNHZXQocGFyYW1zQ2xvbmUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRCYXNlVXJsKCkucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKHYgPT4ge1xuICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHRoaXMucHJlcGFyZUJhc2VBZGRyZXNzKHYpICsgdXJsLCBvcHRpb25zKS5waXBlKFxuICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0RXJyb3IubGVuZ3RoICYmIGVyci5lcnJvci5lcnJvcl9kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIHRleHRFcnJvciA9IGVyci5lcnJvci5lcnJvcl9kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5lcnJvcign0J7RiNC40LHQutCwOiAnICsgdGV4dEVycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpXG4gICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAnZ2V0IGJhc2UgdXJsIGVycm9yJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIuZXJyb3IoJ0Vycm9yOiBBdXRoIG5vdCBnZXQnKVxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICdhdXRoIG5vdCBnZXQnKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIG92ZXJyaWRlIGdldE5hbWVNZXRob2QoYXJyOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBhcnIuam9pbignLicpXG4gIH1cblxufVxuXG4iXX0=
|