bx-rest 0.23.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +578 -0
- package/README.md +110 -84
- package/esm2022/map/calendar/event.mjs +29 -15
- package/esm2022/map/calendar/section.mjs +13 -6
- package/esm2022/map/crm/calllist.mjs +16 -9
- package/esm2022/request-navvy/calendar/event.mjs +20 -8
- package/esm2022/request-navvy/calendar/section.mjs +10 -4
- package/esm2022/request-navvy/crm/calllist/index.mjs +9 -5
- package/esm2022/services/base.mjs +163 -6
- package/esm2022/typification/rest/calendar/event/get.mjs +1 -1
- package/fesm2022/bx-rest.mjs +253 -45
- package/fesm2022/bx-rest.mjs.map +1 -1
- package/map/calendar/event.d.ts +13 -3
- package/map/calendar/section.d.ts +9 -2
- package/map/crm/calllist.d.ts +11 -4
- package/package.json +6 -2
- package/request-navvy/calendar/event.d.ts +11 -5
- package/request-navvy/calendar/section.d.ts +8 -2
- package/request-navvy/crm/calllist/index.d.ts +6 -2
- package/services/base.d.ts +27 -3
- package/typification/rest/calendar/event/get.d.ts +2 -2
package/fesm2022/bx-rest.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { DateTime } from 'luxon';
|
|
2
1
|
import { switchMap, map, catchError, take, mergeMap as mergeMap$1 } from 'rxjs/operators';
|
|
3
2
|
import { Subscription, of, throwError, from, forkJoin, last, shareReplay, mergeMap, concatMap, toArray, map as map$1, tap } from 'rxjs';
|
|
4
3
|
import clone from 'just-clone';
|
|
@@ -102,8 +101,154 @@ class ToNumError extends Error {
|
|
|
102
101
|
].join('\n');
|
|
103
102
|
}
|
|
104
103
|
}
|
|
104
|
+
/** Соответствие токенов формата регулярным группам захвата. Порядок важен: длинные токены проверяются раньше коротких */
|
|
105
|
+
const DATE_FORMAT_TOKENS = [
|
|
106
|
+
['yyyy', '(?<yyyy>\\d{4})'],
|
|
107
|
+
['yy', '(?<yy>\\d{2})'],
|
|
108
|
+
['MM', '(?<MM>\\d{2})'],
|
|
109
|
+
['M', '(?<M>\\d{1,2})'],
|
|
110
|
+
['dd', '(?<dd>\\d{2})'],
|
|
111
|
+
['d', '(?<d>\\d{1,2})'],
|
|
112
|
+
['HH', '(?<HH>\\d{2})'],
|
|
113
|
+
['H', '(?<H>\\d{1,2})'],
|
|
114
|
+
['mm', '(?<mm>\\d{2})'],
|
|
115
|
+
['m', '(?<m>\\d{1,2})'],
|
|
116
|
+
['ss', '(?<ss>\\d{2})'],
|
|
117
|
+
['s', '(?<s>\\d{1,2})'],
|
|
118
|
+
];
|
|
119
|
+
const DATE_FORMAT_TOKEN_REGEX = new RegExp(DATE_FORMAT_TOKENS.map(([token]) => token).join('|'), 'g');
|
|
120
|
+
const TIME_ONLY_TOKENS = new Set(['HH', 'H', 'mm', 'm', 'ss', 's']);
|
|
105
121
|
/**
|
|
106
|
-
*
|
|
122
|
+
* Выводит формат "только дата" из формата даты-и-времени — отрезает время и разделитель перед
|
|
123
|
+
* ним (например, `'dd.MM.yyyy HH:mm:ss'` → `'dd.MM.yyyy'`). Порядок день/месяц/год у полей
|
|
124
|
+
* "дата" и "дата-время" на одном портале Bitrix24 всегда согласован — различается только
|
|
125
|
+
* наличие `HH:mm:ss`, поэтому нет смысла заставлять вызывающего передавать оба формата и
|
|
126
|
+
* держать их в синхроне вручную.
|
|
127
|
+
*/
|
|
128
|
+
function deriveDateOnlyFormat(dateTimeFormat) {
|
|
129
|
+
DATE_FORMAT_TOKEN_REGEX.lastIndex = 0;
|
|
130
|
+
let match;
|
|
131
|
+
while ((match = DATE_FORMAT_TOKEN_REGEX.exec(dateTimeFormat)) !== null) {
|
|
132
|
+
if (TIME_ONLY_TOKENS.has(match[0])) {
|
|
133
|
+
// Отрезаем любой разделитель перед временем, включая буквенный (например 'T' в ISO-стиле
|
|
134
|
+
// 'dd.MM.yyyyTHH:mm:ss'), а не только пунктуацию — останавливаемся на последнем символе,
|
|
135
|
+
// который реально относится к токенам даты (y/M/d).
|
|
136
|
+
const datePart = dateTimeFormat.slice(0, match.index).replace(/[^yMd]+$/, '');
|
|
137
|
+
return datePart || dateTimeFormat;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return dateTimeFormat;
|
|
141
|
+
}
|
|
142
|
+
function escapeRegExp(str) {
|
|
143
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Форматы дат, которые Bitrix24 реально присылает в разных методах REST и на разных
|
|
147
|
+
* порталах — формат даты/времени в ответе зависит от настроек портала (Настройки → формат
|
|
148
|
+
* даты и времени), поэтому один захардкоженный шаблон не универсален. Если явный `format`,
|
|
149
|
+
* переданный в toDate(), не совпал со значением, перед тем как считать строку невалидной,
|
|
150
|
+
* пробуем эти варианты по очереди — они не пересекаются по разделителям/порядку токенов,
|
|
151
|
+
* так что ложных совпадений не будет.
|
|
152
|
+
*/
|
|
153
|
+
const FALLBACK_DATE_FORMATS = [
|
|
154
|
+
'dd.MM.yyyy HH:mm:ss',
|
|
155
|
+
'yyyy-MM-dd HH:mm:ss',
|
|
156
|
+
'dd.MM.yyyy',
|
|
157
|
+
'yyyy-MM-dd',
|
|
158
|
+
];
|
|
159
|
+
/**
|
|
160
|
+
* Разбирает строку даты по простому шаблону (yyyy, MM, dd, HH, mm, ss и их однобуквенные
|
|
161
|
+
* варианты, например 'dd.MM.yyyy HH:mm:ss'). Разделители между токенами берутся из шаблона
|
|
162
|
+
* как есть. Не поддерживает локали, названия месяцев и часовые пояса — для REST-ответов
|
|
163
|
+
* Bitrix24 они не требуются, значения всегда приходят в фиксированном числовом виде.
|
|
164
|
+
*/
|
|
165
|
+
function parseDateWithFormat(val, format) {
|
|
166
|
+
const tokenMap = new Map(DATE_FORMAT_TOKENS);
|
|
167
|
+
let pattern = '';
|
|
168
|
+
let lastIndex = 0;
|
|
169
|
+
let match;
|
|
170
|
+
DATE_FORMAT_TOKEN_REGEX.lastIndex = 0;
|
|
171
|
+
while ((match = DATE_FORMAT_TOKEN_REGEX.exec(format)) !== null) {
|
|
172
|
+
pattern += escapeRegExp(format.slice(lastIndex, match.index));
|
|
173
|
+
pattern += tokenMap.get(match[0]);
|
|
174
|
+
lastIndex = match.index + match[0].length;
|
|
175
|
+
}
|
|
176
|
+
pattern += escapeRegExp(format.slice(lastIndex));
|
|
177
|
+
const result = new RegExp(`^${pattern}$`).exec(val);
|
|
178
|
+
if (!result?.groups) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
const g = result.groups;
|
|
182
|
+
const year = g['yyyy'] ? Number(g['yyyy']) : g['yy'] ? 2000 + Number(g['yy']) : new Date().getFullYear();
|
|
183
|
+
const month = Number(g['MM'] ?? g['M'] ?? 1);
|
|
184
|
+
const day = Number(g['dd'] ?? g['d'] ?? 1);
|
|
185
|
+
const hour = Number(g['HH'] ?? g['H'] ?? 0);
|
|
186
|
+
const minute = Number(g['mm'] ?? g['m'] ?? 0);
|
|
187
|
+
const second = Number(g['ss'] ?? g['s'] ?? 0);
|
|
188
|
+
// Токены — это просто "N цифр", без проверки диапазона (regex не отличит "13" месяца от
|
|
189
|
+
// "13" дня). Без этой проверки new Date() молча "перекатывает" переполнение на соседний
|
|
190
|
+
// месяц/год (например, месяц=13 → январь следующего года) вместо того, чтобы считать
|
|
191
|
+
// строку невалидной.
|
|
192
|
+
if (month < 1 || month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || second > 59) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const date = new Date(year, month - 1, day, hour, minute, second);
|
|
196
|
+
return isNaN(date.getTime()) ? null : date;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Последний резервный разбор — без знания конкретного формата. Работает только для чисто
|
|
200
|
+
* числовых дат (никаких названий месяцев/дней — для этого нужны locale-таблицы, а это как
|
|
201
|
+
* раз тот вес, ради ухода от которого luxon был убран из зависимостей).
|
|
202
|
+
*
|
|
203
|
+
* Идея: год — единственный сегмент длиной ровно 4 цифры, поэтому его позиция (первый или
|
|
204
|
+
* последний из трёх сегментов даты) однозначно опознаётся при любом разделителе (`.`, `-`,
|
|
205
|
+
* `/`, пробел...). Месяц по всем распространённым в мире соглашениям (ISO `yyyy-MM-dd` и
|
|
206
|
+
* европейское `dd.MM.yyyy`) стоит между годом и днём, поэтому берётся как средний сегмент.
|
|
207
|
+
* Время, если есть, всегда идёт как `HH:mm:ss` — этот порядок универсален.
|
|
208
|
+
*
|
|
209
|
+
* Не решает и не пытается решить неоднозначность день/месяц в чисто числовых форматах вида
|
|
210
|
+
* `MM/dd/yyyy` (США), где оба сегмента могут быть ≤12 — угадывать это без знания локали
|
|
211
|
+
* значило бы иногда молча путать день с месяцем, что хуже явной ошибки.
|
|
212
|
+
*/
|
|
213
|
+
function parseDateHeuristically(val) {
|
|
214
|
+
const parts = val.match(/\d+/g);
|
|
215
|
+
if (!parts || parts.length < 3 || parts.length > 6) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
const [d0, d1, d2, ...timeParts] = parts;
|
|
219
|
+
const dateParts = [d0, d1, d2];
|
|
220
|
+
const yearIdx = dateParts.findIndex(p => p.length === 4);
|
|
221
|
+
// Год должен быть однозначно найден (ровно 4 цифры) и стоять с края, а не в середине —
|
|
222
|
+
// иначе позиция месяца/дня не определить безопасно.
|
|
223
|
+
if (yearIdx !== 0 && yearIdx !== 2) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
const year = Number(dateParts[yearIdx]);
|
|
227
|
+
const month = Number(dateParts[1]);
|
|
228
|
+
const day = Number(dateParts[yearIdx === 0 ? 2 : 0]);
|
|
229
|
+
if (month < 1 || month > 12 || day < 1 || day > 31) {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
const [hh, mm, ss] = timeParts;
|
|
233
|
+
const hour = hh !== undefined ? Number(hh) : 0;
|
|
234
|
+
const minute = mm !== undefined ? Number(mm) : 0;
|
|
235
|
+
const second = ss !== undefined ? Number(ss) : 0;
|
|
236
|
+
if (hour > 23 || minute > 59 || second > 59) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
const date = new Date(year, month - 1, day, hour, minute, second);
|
|
240
|
+
return isNaN(date.getTime()) ? null : date;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Преобразует значение в дату.
|
|
244
|
+
*
|
|
245
|
+
* Если передан `format`, но значение ему не соответствует (см. FALLBACK_DATE_FORMATS —
|
|
246
|
+
* актуально для полей, где Bitrix24 отдаёт дату в формате, настроенном на портале, а не в
|
|
247
|
+
* том, что захардкожен в маппере), перед тем как считать значение невалидным, делаются ещё
|
|
248
|
+
* две попытки: другие распространённые форматы Bitrix24, а затем — позиционная эвристика
|
|
249
|
+
* (см. parseDateHeuristically), которая распознаёт практически любой чисто числовой формат
|
|
250
|
+
* даты независимо от разделителя. Если приложению точно известен формат конкретного портала,
|
|
251
|
+
* его стоит передавать явным `format` — это всегда приоритетнее угадывания.
|
|
107
252
|
*/
|
|
108
253
|
function toDate(val, format, opt, throwError = true) {
|
|
109
254
|
if (val instanceof Date) {
|
|
@@ -111,10 +256,22 @@ function toDate(val, format, opt, throwError = true) {
|
|
|
111
256
|
}
|
|
112
257
|
else if (typeof val === 'string') {
|
|
113
258
|
if (format) {
|
|
114
|
-
|
|
115
|
-
|
|
259
|
+
const parsed = parseDateWithFormat(val, format);
|
|
260
|
+
if (parsed) {
|
|
261
|
+
return parsed;
|
|
262
|
+
}
|
|
263
|
+
for (const fallbackFormat of FALLBACK_DATE_FORMATS) {
|
|
264
|
+
if (fallbackFormat === format)
|
|
265
|
+
continue;
|
|
266
|
+
const fallbackParsed = parseDateWithFormat(val, fallbackFormat);
|
|
267
|
+
if (fallbackParsed) {
|
|
268
|
+
return fallbackParsed;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const heuristicParsed = parseDateHeuristically(val);
|
|
272
|
+
if (heuristicParsed) {
|
|
273
|
+
return heuristicParsed;
|
|
116
274
|
}
|
|
117
|
-
return DateTime.fromFormat(val, format).toJSDate();
|
|
118
275
|
}
|
|
119
276
|
else {
|
|
120
277
|
return new Date(val);
|
|
@@ -255,6 +412,7 @@ var base = /*#__PURE__*/Object.freeze({
|
|
|
255
412
|
__proto__: null,
|
|
256
413
|
ToNumError: ToNumError,
|
|
257
414
|
cropUrl: cropUrl,
|
|
415
|
+
deriveDateOnlyFormat: deriveDateOnlyFormat,
|
|
258
416
|
getBase64File: getBase64File,
|
|
259
417
|
getBase64FileLikeStr: getBase64FileLikeStr,
|
|
260
418
|
getBaseUrlHttps: getBaseUrlHttps,
|
|
@@ -6783,13 +6941,24 @@ class BXRestNavvyLog {
|
|
|
6783
6941
|
}
|
|
6784
6942
|
|
|
6785
6943
|
class BXRestMapCalendarEvent {
|
|
6786
|
-
|
|
6787
|
-
|
|
6944
|
+
/**
|
|
6945
|
+
* @param item
|
|
6946
|
+
* @param dateTimeFormat Формат полей с датой и временем (`DATE_CREATE`, `DATE_FROM`, `DATE_TO`, `TIMESTAMP_X`
|
|
6947
|
+
* и т.д.). По умолчанию — распространённый на многих порталах `'dd.MM.yyyy HH:mm:ss'`, но реальный формат
|
|
6948
|
+
* зависит от настроек портала (Настройки → формат даты и времени) — если он известен, передавайте его явно.
|
|
6949
|
+
* Формат для полей только с датой (`EXDATE`, `RRULE.UNTIL`) выводится из этого же значения
|
|
6950
|
+
* (отбрасыванием `HH:mm:ss`) — передавать его отдельно не нужно.
|
|
6951
|
+
*/
|
|
6952
|
+
static getById(item, dateTimeFormat = 'dd.MM.yyyy HH:mm:ss') {
|
|
6953
|
+
return (item) ? BXRestMapCalendarEvent.CalendarEventGetAnswerHttpToCalendarEventGetAnswer(item, dateTimeFormat) : undefined;
|
|
6788
6954
|
}
|
|
6789
|
-
|
|
6790
|
-
|
|
6955
|
+
/** @see getById */
|
|
6956
|
+
static get(item, dateTimeFormat = 'dd.MM.yyyy HH:mm:ss') {
|
|
6957
|
+
return (item) ? item.map(i => BXRestMapCalendarEvent.CalendarEventGetAnswerHttpToCalendarEventGetAnswer(i, dateTimeFormat)) : undefined;
|
|
6791
6958
|
}
|
|
6792
|
-
|
|
6959
|
+
/** @see getById */
|
|
6960
|
+
static CalendarEventGetAnswerHttpToCalendarEventGetAnswer(item, dateTimeFormat = 'dd.MM.yyyy HH:mm:ss') {
|
|
6961
|
+
const dateFormat = deriveDateOnlyFormat(dateTimeFormat);
|
|
6793
6962
|
return {
|
|
6794
6963
|
...item,
|
|
6795
6964
|
ID: toNum(item.ID),
|
|
@@ -6802,24 +6971,27 @@ class BXRestMapCalendarEvent {
|
|
|
6802
6971
|
TZ_OFFSET_FROM: toNum(item.TZ_OFFSET_FROM),
|
|
6803
6972
|
TZ_OFFSET_TO: toNum(item.TZ_OFFSET_TO),
|
|
6804
6973
|
VERSION: toNum(item.VERSION),
|
|
6805
|
-
DATE_CREATE: toDate(item.DATE_CREATE,
|
|
6806
|
-
DATE_FROM: toDate(item.DATE_FROM,
|
|
6974
|
+
DATE_CREATE: toDate(item.DATE_CREATE, dateTimeFormat),
|
|
6975
|
+
DATE_FROM: toDate(item.DATE_FROM, dateTimeFormat),
|
|
6807
6976
|
ORIGINAL_DATE_FROM: (item.ORIGINAL_DATE_FROM)
|
|
6808
|
-
? toDate(item.ORIGINAL_DATE_FROM,
|
|
6977
|
+
? toDate(item.ORIGINAL_DATE_FROM, dateTimeFormat)
|
|
6809
6978
|
: null,
|
|
6810
|
-
DATE_TO: toDate(item.DATE_TO,
|
|
6811
|
-
TIMESTAMP_X: toDate(item.TIMESTAMP_X,
|
|
6979
|
+
DATE_TO: toDate(item.DATE_TO, dateTimeFormat),
|
|
6980
|
+
TIMESTAMP_X: toDate(item.TIMESTAMP_X, dateTimeFormat),
|
|
6812
6981
|
DATE_FROM_TS_UTC: toNum(item.DATE_FROM_TS_UTC),
|
|
6813
6982
|
DATE_TO_TS_UTC: toNum(item.DATE_TO_TS_UTC),
|
|
6814
6983
|
DELETED: item.DELETED === 'Y',
|
|
6815
6984
|
DT_LENGTH: toNum(item.DT_LENGTH),
|
|
6816
6985
|
DT_SKIP_TIME: item.DT_SKIP_TIME === 'Y',
|
|
6817
6986
|
MEETING_STATUS: item.MEETING_STATUS === 'Y',
|
|
6818
|
-
EXDATE
|
|
6987
|
+
// EXDATE и RRULE.UNTIL/'~UNTIL' у Bitrix нередко приходят пустой строкой (нет исключённых
|
|
6988
|
+
// дат повторения / правило повторения ограничено через COUNT, а не датой) — пустую строку
|
|
6989
|
+
// toDate() распарсить не может ни при каком формате, поэтому такие поля пропускаем до вызова
|
|
6990
|
+
EXDATE: item.EXDATE ? item.EXDATE.split(';').filter(Boolean).map(dateStr => toDate(dateStr, dateFormat)) : [],
|
|
6819
6991
|
RRULE: (item.RRULE && typeof item.RRULE !== 'string') ? {
|
|
6820
6992
|
...item.RRULE,
|
|
6821
|
-
UNTIL: toDate(item.RRULE.UNTIL,
|
|
6822
|
-
'~UNTIL': toDate(item.RRULE['~UNTIL'],
|
|
6993
|
+
UNTIL: item.RRULE.UNTIL ? toDate(item.RRULE.UNTIL, dateFormat) : null,
|
|
6994
|
+
'~UNTIL': item.RRULE['~UNTIL'] ? toDate(item.RRULE['~UNTIL'], dateFormat) : null
|
|
6823
6995
|
} : null,
|
|
6824
6996
|
ATTENDEE_LIST: (item.ATTENDEE_LIST) ? item.ATTENDEE_LIST.map(i => {
|
|
6825
6997
|
return { id: i.id, entryId: toNum(i.entryId), status: i.status };
|
|
@@ -6855,10 +7027,16 @@ class BXRestNavvyRestCalendarEvent {
|
|
|
6855
7027
|
// )
|
|
6856
7028
|
// }
|
|
6857
7029
|
this.get = Object.assign(
|
|
6858
|
-
/**
|
|
6859
|
-
|
|
6860
|
-
|
|
6861
|
-
|
|
7030
|
+
/**
|
|
7031
|
+
* Возвращает список событий календаря, всегда весь список, паганации в методе нет да и не нужна.
|
|
7032
|
+
*
|
|
7033
|
+
* @param param
|
|
7034
|
+
* @param dateTimeFormat Формат полей с датой и временем в ответе (см. {@link BXRestMapCalendarEvent.get}).
|
|
7035
|
+
* Передавайте явно, если формат дат на портале отличается от значения по умолчанию.
|
|
7036
|
+
*/
|
|
7037
|
+
(param, dateTimeFormat) => this.Navvy.simple(this.url.get, param, (raw) => BXRestMapCalendarEvent.get(raw, dateTimeFormat)), {
|
|
7038
|
+
/** Метод получает список будущих событий. @see get */
|
|
7039
|
+
nearest: (param, dateTimeFormat) => this.Navvy.simple(this.url.get.nearest, param, (raw) => BXRestMapCalendarEvent.get(raw, dateTimeFormat)),
|
|
6862
7040
|
});
|
|
6863
7041
|
}
|
|
6864
7042
|
/** Добавляет событие в календарь */
|
|
@@ -6873,24 +7051,37 @@ class BXRestNavvyRestCalendarEvent {
|
|
|
6873
7051
|
update(param) {
|
|
6874
7052
|
return this.Navvy.simple(this.url.update, param);
|
|
6875
7053
|
}
|
|
6876
|
-
/**
|
|
6877
|
-
|
|
6878
|
-
|
|
7054
|
+
/**
|
|
7055
|
+
* Метод получает информацию о событии календаря по идентификатору.
|
|
7056
|
+
*
|
|
7057
|
+
* @param param
|
|
7058
|
+
* @param dateTimeFormat Формат полей с датой и временем в ответе (см. {@link BXRestMapCalendarEvent.getById}).
|
|
7059
|
+
* Передавайте явно, если формат дат на портале отличается от значения по умолчанию.
|
|
7060
|
+
*/
|
|
7061
|
+
getById(param, dateTimeFormat) {
|
|
7062
|
+
return this.Navvy.simple(this.url.getById, param, (raw) => BXRestMapCalendarEvent.getById(raw, dateTimeFormat));
|
|
6879
7063
|
}
|
|
6880
7064
|
}
|
|
6881
7065
|
|
|
6882
7066
|
class BXRestMapCalendarSection {
|
|
6883
|
-
|
|
6884
|
-
|
|
7067
|
+
/**
|
|
7068
|
+
* @param item
|
|
7069
|
+
* @param dateTimeFormat Формат полей `DATE_CREATE`/`TIMESTAMP_X`. По умолчанию — распространённый на многих
|
|
7070
|
+
* порталах `'dd.MM.yyyy HH:mm:ss'`, но реальный формат зависит от настроек портала (Настройки → формат
|
|
7071
|
+
* даты и времени) — если он известен, передавайте его явно.
|
|
7072
|
+
*/
|
|
7073
|
+
static get(item, dateTimeFormat = 'dd.MM.yyyy HH:mm:ss') {
|
|
7074
|
+
return (item) ? item.map(i => BXRestMapCalendarSection.CalendarSectionGetHttpToCalendarSectionGetHttp(i, dateTimeFormat)) : undefined;
|
|
6885
7075
|
}
|
|
6886
|
-
|
|
7076
|
+
/** @see get */
|
|
7077
|
+
static CalendarSectionGetHttpToCalendarSectionGetHttp(item, dateTimeFormat = 'dd.MM.yyyy HH:mm:ss') {
|
|
6887
7078
|
return {
|
|
6888
7079
|
...item,
|
|
6889
7080
|
ID: toNum(item.ID),
|
|
6890
7081
|
OWNER_ID: toNum(item.OWNER_ID),
|
|
6891
7082
|
CREATED_BY: toNum(item.CREATED_BY),
|
|
6892
|
-
DATE_CREATE: toDate(item.DATE_CREATE,
|
|
6893
|
-
TIMESTAMP_X: toDate(item.TIMESTAMP_X,
|
|
7083
|
+
DATE_CREATE: toDate(item.DATE_CREATE, dateTimeFormat),
|
|
7084
|
+
TIMESTAMP_X: toDate(item.TIMESTAMP_X, dateTimeFormat)
|
|
6894
7085
|
};
|
|
6895
7086
|
}
|
|
6896
7087
|
}
|
|
@@ -6909,9 +7100,15 @@ class BXRestNavvyRestCalendarSection {
|
|
|
6909
7100
|
};
|
|
6910
7101
|
this.Navvy = new Navvy();
|
|
6911
7102
|
}
|
|
6912
|
-
/**
|
|
6913
|
-
|
|
6914
|
-
|
|
7103
|
+
/**
|
|
7104
|
+
* Возвращает описание разделов, всегда весь список, паганации в методе нет да и не нужна.
|
|
7105
|
+
*
|
|
7106
|
+
* @param param
|
|
7107
|
+
* @param dateTimeFormat Формат полей `DATE_CREATE`/`TIMESTAMP_X` в ответе (см. {@link BXRestMapCalendarSection.get}).
|
|
7108
|
+
* Передавайте явно, если формат дат на портале отличается от значения по умолчанию.
|
|
7109
|
+
*/
|
|
7110
|
+
get(param, dateTimeFormat) {
|
|
7111
|
+
return this.Navvy.simple(this.url.get, param, (raw) => BXRestMapCalendarSection.get(raw, dateTimeFormat));
|
|
6915
7112
|
}
|
|
6916
7113
|
/** Добавляет новый раздел */
|
|
6917
7114
|
add(param) {
|
|
@@ -9309,22 +9506,29 @@ class BXRestMapCrmStatus {
|
|
|
9309
9506
|
}
|
|
9310
9507
|
|
|
9311
9508
|
class BXRestMapCrmCallList {
|
|
9312
|
-
/**
|
|
9313
|
-
|
|
9314
|
-
|
|
9509
|
+
/**
|
|
9510
|
+
* Преобразует данные списка обзвона из формата Bitrix24 в локальный формат.
|
|
9511
|
+
*
|
|
9512
|
+
* @param value
|
|
9513
|
+
* @param dateTimeFormat Формат поля `DATE_CREATE`. По умолчанию — `'yyyy-MM-dd HH:mm:ss'`, но реальный
|
|
9514
|
+
* формат зависит от настроек портала (Настройки → формат даты и времени) — если он известен,
|
|
9515
|
+
* передавайте его явно.
|
|
9516
|
+
*/
|
|
9517
|
+
static get(value, dateTimeFormat = 'yyyy-MM-dd HH:mm:ss') {
|
|
9518
|
+
return this.mapItem(value, dateTimeFormat);
|
|
9315
9519
|
}
|
|
9316
|
-
/** Преобразует список обзвонов с учетом полей, выбранных через `SELECT`. */
|
|
9317
|
-
static list(value) {
|
|
9318
|
-
return value?.map(item => this.mapItem(item));
|
|
9520
|
+
/** Преобразует список обзвонов с учетом полей, выбранных через `SELECT`. @see get */
|
|
9521
|
+
static list(value, dateTimeFormat = 'yyyy-MM-dd HH:mm:ss') {
|
|
9522
|
+
return value?.map(item => this.mapItem(item, dateTimeFormat));
|
|
9319
9523
|
}
|
|
9320
|
-
static mapItem(value) {
|
|
9524
|
+
static mapItem(value, dateTimeFormat = 'yyyy-MM-dd HH:mm:ss') {
|
|
9321
9525
|
if (!value)
|
|
9322
9526
|
return undefined;
|
|
9323
9527
|
const result = clone(value);
|
|
9324
9528
|
if (value.ID !== undefined)
|
|
9325
9529
|
result.ID = toNum(value.ID);
|
|
9326
9530
|
if (value.DATE_CREATE !== undefined) {
|
|
9327
|
-
result.DATE_CREATE = toDate(value.DATE_CREATE,
|
|
9531
|
+
result.DATE_CREATE = toDate(value.DATE_CREATE, dateTimeFormat);
|
|
9328
9532
|
}
|
|
9329
9533
|
if (value.CREATED_BY_ID !== undefined)
|
|
9330
9534
|
result.CREATED_BY_ID = toNum(value.CREATED_BY_ID);
|
|
@@ -11331,10 +11535,12 @@ class BXRestNavvyCrmCallList {
|
|
|
11331
11535
|
* Участников можно получить через `items.get()`.
|
|
11332
11536
|
*
|
|
11333
11537
|
* @param param Идентификатор списка обзвона.
|
|
11538
|
+
* @param dateTimeFormat Формат поля `DATE_CREATE` в ответе (см. {@link BXRestMapCrmCallList.get}).
|
|
11539
|
+
* Передавайте явно, если формат дат на портале отличается от значения по умолчанию.
|
|
11334
11540
|
* @see https://apidocs.bitrix24.ru/api-reference/crm/call-list/crm-calllist-get.html
|
|
11335
11541
|
*/
|
|
11336
|
-
get(param) {
|
|
11337
|
-
return this.Navvy.simple(this.url.get, param, BXRestMapCrmCallList.get);
|
|
11542
|
+
get(param, dateTimeFormat) {
|
|
11543
|
+
return this.Navvy.simple(this.url.get, param, (raw) => BXRestMapCrmCallList.get(raw, dateTimeFormat));
|
|
11338
11544
|
}
|
|
11339
11545
|
/**
|
|
11340
11546
|
* Возвращает списки обзвона с выборкой полей, фильтрацией и сортировкой.
|
|
@@ -11342,10 +11548,12 @@ class BXRestNavvyCrmCallList {
|
|
|
11342
11548
|
* Набор полей каждого элемента результата зависит от `SELECT`.
|
|
11343
11549
|
*
|
|
11344
11550
|
* @param param Выбираемые поля, фильтр и порядок сортировки.
|
|
11551
|
+
* @param dateTimeFormat Формат поля `DATE_CREATE` в ответе (см. {@link BXRestMapCrmCallList.list}).
|
|
11552
|
+
* Передавайте явно, если формат дат на портале отличается от значения по умолчанию.
|
|
11345
11553
|
* @see https://apidocs.bitrix24.ru/api-reference/crm/call-list/crm-calllist-list.html
|
|
11346
11554
|
*/
|
|
11347
|
-
list(param = {}) {
|
|
11348
|
-
return this.Navvy.simple(this.url.list, param, BXRestMapCrmCallList.list);
|
|
11555
|
+
list(param = {}, dateTimeFormat) {
|
|
11556
|
+
return this.Navvy.simple(this.url.list, param, (raw) => BXRestMapCrmCallList.list(raw, dateTimeFormat));
|
|
11349
11557
|
}
|
|
11350
11558
|
/**
|
|
11351
11559
|
* Возвращает справочник статусов обзвона.
|