@infomaximum/widget-sdk 7.0.0-15 → 7.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/dist/index.js CHANGED
@@ -32,6 +32,7 @@ var apiVersions = [
32
32
  "16.2", // Для версии системы 250709
33
33
  "17", // 2508
34
34
  "18", // 2601
35
+ "19", // 2602
35
36
  ];
36
37
  /**
37
38
  * Актуальная версия settings, с которой работает система.
@@ -222,6 +223,21 @@ function memoize(fn) {
222
223
  return result;
223
224
  };
224
225
  }
226
+ var clamp = function (value, min, max) {
227
+ if (value < min) {
228
+ return min;
229
+ }
230
+ if (value > max) {
231
+ return max;
232
+ }
233
+ return value;
234
+ };
235
+ function mapValues(obj, fn) {
236
+ return Object.fromEntries(Object.entries(obj).map(function (_a) {
237
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
238
+ return [key, fn(value, key)];
239
+ }));
240
+ }
225
241
  /** Добавляет свойства к функции */
226
242
  function assignPropsToFn(fn, props) {
227
243
  return Object.assign(fn, props);
@@ -266,6 +282,31 @@ var VersionedSchemaFactory = /** @class */ (function () {
266
282
  });
267
283
  };
268
284
  };
285
+ /**
286
+ * Оборачивает фабрику схемы, добавляя кеширование результата.
287
+ *
288
+ * Предполагается, что `z` — синглтон (один экземпляр на всё приложение),
289
+ * поэтому достаточно закешировать единственный результат.
290
+ *
291
+ * Вызовы с дополнительными аргументами (restArgs) не кешируются,
292
+ * так как результат может зависеть от их значений.
293
+ */
294
+ VersionedSchemaFactory.withCache = function (schemaFactory) {
295
+ var cached;
296
+ return (function (z) {
297
+ var restArgs = [];
298
+ for (var _i = 1; _i < arguments.length; _i++) {
299
+ restArgs[_i - 1] = arguments[_i];
300
+ }
301
+ if (restArgs.length > 0) {
302
+ return schemaFactory.apply(void 0, __spreadArray([z], __read(restArgs), false));
303
+ }
304
+ if (cached === undefined) {
305
+ cached = schemaFactory(z);
306
+ }
307
+ return cached;
308
+ });
309
+ };
269
310
  /** Построить версионированную схему */
270
311
  VersionedSchemaFactory.build = function (_a) {
271
312
  var _this = this;
@@ -274,20 +315,23 @@ var VersionedSchemaFactory = /** @class */ (function () {
274
315
  if (!latestFactory) {
275
316
  throw new Error("Не найдено записи в 'history' по 'latestVersion'");
276
317
  }
277
- var map = this.annotateSchema(meta);
278
- var schema = assignPropsToFn(map(latestFactory), {
318
+ var annotate = this.annotateSchema(meta);
319
+ var preparedHistory = mapValues(history, function (factory) {
320
+ return _this.withCache(annotate(factory));
321
+ });
322
+ var schema = assignPropsToFn(preparedHistory[latestVersion], {
279
323
  forVersion: function (targetVersion) {
280
324
  if (targetVersion === null || targetVersion === undefined) {
281
- return map(latestFactory);
325
+ return preparedHistory[latestVersion];
282
326
  }
283
- if (targetVersion in history) {
284
- return map(history[targetVersion]);
327
+ if (targetVersion in preparedHistory) {
328
+ return preparedHistory[targetVersion];
285
329
  }
286
- var closestVersion = _this.findClosestVersion(Object.keys(history), targetVersion, VersionedSchemaFactory.compareVersions);
287
- if (closestVersion === undefined || !(closestVersion in history)) {
330
+ var closestVersion = _this.findClosestVersion(Object.keys(preparedHistory), targetVersion, VersionedSchemaFactory.compareVersions);
331
+ if (closestVersion === undefined || !(closestVersion in preparedHistory)) {
288
332
  throw new Error("\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0435\u0439 \u0441\u0445\u0435\u043C\u044B \u0434\u043B\u044F \u0432\u0435\u0440\u0441\u0438\u0438 '".concat(targetVersion, "'"));
289
333
  }
290
- return map(history[closestVersion]);
334
+ return preparedHistory[closestVersion];
291
335
  },
292
336
  });
293
337
  return schema;
@@ -377,9 +421,9 @@ var AutoIdentifiedArrayItemSchema = SchemaRegistry.define({
377
421
  });
378
422
  var BaseWidgetSettingsSchema = SchemaRegistry.define({
379
423
  key: "BaseWidgetSettings",
380
- latestVersion: "17",
381
- history: {
382
- "17": function (z) {
424
+ latestVersion: "19",
425
+ get history() {
426
+ var v17 = function (z) {
383
427
  return z.object({
384
428
  title: z.string().default(""),
385
429
  titleSize: themed(z.number().default(14), function (theme) { return theme.widgets.titleSize; }),
@@ -395,10 +439,14 @@ var BaseWidgetSettingsSchema = SchemaRegistry.define({
395
439
  ignoreFilters: z.boolean().default(false),
396
440
  sorting: z.array(WidgetSortingIndicatorSchema.forVersion("17")(z)).default([]),
397
441
  actionButtons: z.array(ActionButtonSchema.forVersion("17")(z)).default([]),
398
- paddings: themed(z.union([z.number(), z.string()]).default(8), function (theme) { return theme.widgets.paddings; }),
442
+ paddings: z.union([z.number(), z.string()]).default(8),
399
443
  viewTheme: z.boolean().default(false),
400
444
  });
401
- },
445
+ };
446
+ return {
447
+ "17": v17,
448
+ "19": function (z) { return v17(z).omit({ paddings: true }); },
449
+ };
402
450
  },
403
451
  });
404
452
 
@@ -2834,7 +2882,7 @@ exports.ESortDirection = void 0;
2834
2882
  * Если к разрезу иерархии применяется INCLUDE-фильтр с несколькими значениями - выбираем данный разрез
2835
2883
  */
2836
2884
  function selectDimensionFromHierarchy(hierarchy, filters) {
2837
- var hierarchyDimensions = hierarchy.hierarchyDimensions; hierarchy.displayCondition;
2885
+ var hierarchyDimensions = hierarchy.hierarchyDimensions;
2838
2886
  var _loop_1 = function (i) {
2839
2887
  var dimension = hierarchyDimensions[i];
2840
2888
  // todo: widgets - возможно, стоит использовать Map фильтров для быстрого поиска
@@ -3147,6 +3195,39 @@ var replaceFiltersBySelection = function (filters, selection) {
3147
3195
  }, []);
3148
3196
  };
3149
3197
 
3198
+ var colors = [
3199
+ "#222F3E",
3200
+ "#00D2D3",
3201
+ "#5F27CD",
3202
+ "#FECA57",
3203
+ "#078936",
3204
+ "#E51320",
3205
+ "#96AABF",
3206
+ "#1C55E7",
3207
+ "#341F97",
3208
+ "#FFDD59",
3209
+ "#D82C46",
3210
+ "#0BE881",
3211
+ "#0ABDE3",
3212
+ "#FF9F43",
3213
+ "#EC41D4",
3214
+ "#117F8E",
3215
+ "#B9B9B9",
3216
+ "#505BF1",
3217
+ "#64FFB6",
3218
+ "#485460",
3219
+ "#FFD32A",
3220
+ "#C74E1A",
3221
+ "#6E70A6",
3222
+ "#3C40C6",
3223
+ "#48DBFB",
3224
+ "#486179",
3225
+ "#FF9FF3",
3226
+ "#1DD1A1",
3227
+ "#BCC8D4",
3228
+ "#BA46AA",
3229
+ ];
3230
+
3150
3231
  exports.EColorMode = void 0;
3151
3232
  (function (EColorMode) {
3152
3233
  /** Окрашивание отключено */
@@ -3166,6 +3247,7 @@ exports.EColorMode = void 0;
3166
3247
  /** Задать цвет конкретным значениям общего разреза. Режим используется только для настроек правила отображения */
3167
3248
  EColorMode["BY_DIMENSION"] = "BY_DIMENSION";
3168
3249
  })(exports.EColorMode || (exports.EColorMode = {}));
3250
+
3169
3251
  var getRuleColor = function (ruleFormula, globalContext) {
3170
3252
  var _a, _b;
3171
3253
  var link = parseIndicatorLink(ruleFormula);
@@ -3187,38 +3269,6 @@ var isValidColor = function (color, globalContext) {
3187
3269
  }
3188
3270
  return true;
3189
3271
  };
3190
- var colors = [
3191
- "#222F3E",
3192
- "#00D2D3",
3193
- "#5F27CD",
3194
- "#FECA57",
3195
- "#078936",
3196
- "#E51320",
3197
- "#96AABF",
3198
- "#1C55E7",
3199
- "#341F97",
3200
- "#FFDD59",
3201
- "#D82C46",
3202
- "#0BE881",
3203
- "#0ABDE3",
3204
- "#FF9F43",
3205
- "#EC41D4",
3206
- "#117F8E",
3207
- "#B9B9B9",
3208
- "#505BF1",
3209
- "#64FFB6",
3210
- "#485460",
3211
- "#FFD32A",
3212
- "#C74E1A",
3213
- "#6E70A6",
3214
- "#3C40C6",
3215
- "#48DBFB",
3216
- "#486179",
3217
- "#FF9FF3",
3218
- "#1DD1A1",
3219
- "#BCC8D4",
3220
- "#BA46AA",
3221
- ];
3222
3272
  /**
3223
3273
  * Получить цвет по индексу элемента
3224
3274
  * @param index - индекс элемента, которому требуется цвет
@@ -3233,51 +3283,6 @@ var getColorByIndex = function (index) {
3233
3283
  return color;
3234
3284
  };
3235
3285
 
3236
- var WidgetPresetSettingsSchema = SchemaRegistry.define({
3237
- key: "WidgetPresetSettings",
3238
- latestVersion: "17",
3239
- history: {
3240
- "17": function (z) {
3241
- return BaseWidgetSettingsSchema.forVersion("17")(z)
3242
- .pick({
3243
- filterMode: true,
3244
- ignoreFilters: true,
3245
- stateName: true,
3246
- titleColor: true,
3247
- titleSize: true,
3248
- titleWeight: true,
3249
- paddings: true,
3250
- })
3251
- .extend({
3252
- textSize: z.number().default(12),
3253
- });
3254
- },
3255
- },
3256
- });
3257
-
3258
- /**
3259
- * Привязывает мета-информацию о теме к Zod-схеме
3260
- *
3261
- * @template Value - Тип значения схемы
3262
- * @template Theme - Тип темы (по умолчанию ITheme)
3263
- *
3264
- * @param scheme - Zod схема для привязки
3265
- * @param selectThemeValue - Функция, возвращающая значение из темы
3266
- *
3267
- * @returns Zod схему с мета-информацией о теме
3268
- *
3269
- * @example
3270
- * // Базовое использование
3271
- * textSize: themed(
3272
- * z.number().default(12),
3273
- * (theme) => theme.textSize
3274
- * )
3275
- */
3276
- var themed = function (scheme, selectThemeValue) {
3277
- var _a;
3278
- return scheme.meta((_a = {}, _a[exports.ESettingsSchemaMetaKey.themeValue] = selectThemeValue, _a));
3279
- };
3280
-
3281
3286
  var ColorBaseSchema = SchemaRegistry.define({
3282
3287
  key: "ColorBase",
3283
3288
  latestVersion: "17",
@@ -3425,6 +3430,98 @@ var ColorSchema = SchemaRegistry.define({
3425
3430
  },
3426
3431
  });
3427
3432
 
3433
+ var hexToRgb = function (hex) {
3434
+ if (hex.length === 0) {
3435
+ return;
3436
+ }
3437
+ var rgbTuple = [0, 0, 0];
3438
+ var matchArray = hex
3439
+ .replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function (m, r, g, b) { return "#".concat(r).concat(r).concat(g).concat(g).concat(b).concat(b); })
3440
+ .substring(1)
3441
+ .match(/.{2}/g);
3442
+ matchArray === null || matchArray === void 0 ? void 0 : matchArray.forEach(function (value, index) {
3443
+ if (index > 2) {
3444
+ return undefined;
3445
+ }
3446
+ rgbTuple[index] = parseInt(value, 16);
3447
+ });
3448
+ return rgbTuple;
3449
+ };
3450
+
3451
+ var rgbToHex = function (rgb) {
3452
+ return "#".concat(rgb.map(function (x) { return x.toString(16).padStart(2, "0"); }).join(""));
3453
+ };
3454
+
3455
+ var lerp = function (a, b, t) { return a + (b - a) * t; };
3456
+ /**
3457
+ * Вычисляет промежуточный hex цвет между двумя цветами путем линейной интерполяции
3458
+ * в RGB пространстве
3459
+ *
3460
+ * @param startHex цвет начала
3461
+ * @param endHex цвет конца
3462
+ * @param position позиция на градиенте от 0 до 1
3463
+ */
3464
+ var interpolateHexColor = function (startHex, endHex, position) {
3465
+ var clampedPosition = clamp(position, 0, 1);
3466
+ var startRgb = hexToRgb(startHex);
3467
+ var endRgb = hexToRgb(endHex);
3468
+ if (!startRgb || !endRgb) {
3469
+ throw new Error("\u041D\u0435\u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u044B\u0435 \u0446\u0432\u0435\u0442\u0430: start: ".concat(startHex, ", end: ").concat(endHex));
3470
+ }
3471
+ var interpolated = [
3472
+ Math.round(lerp(startRgb[0], endRgb[0], clampedPosition)),
3473
+ Math.round(lerp(startRgb[1], endRgb[1], clampedPosition)),
3474
+ Math.round(lerp(startRgb[2], endRgb[2], clampedPosition)),
3475
+ ];
3476
+ return rgbToHex(interpolated);
3477
+ };
3478
+
3479
+ /** @deprecated временно используется для миграции */
3480
+ var WidgetPresetSettingsSchema = SchemaRegistry.define({
3481
+ key: "WidgetPresetSettings",
3482
+ latestVersion: "17",
3483
+ history: {
3484
+ "17": function (z) {
3485
+ return BaseWidgetSettingsSchema.forVersion("17")(z)
3486
+ .pick({
3487
+ filterMode: true,
3488
+ ignoreFilters: true,
3489
+ stateName: true,
3490
+ titleColor: true,
3491
+ titleSize: true,
3492
+ titleWeight: true,
3493
+ paddings: true,
3494
+ })
3495
+ .extend({
3496
+ textSize: z.number().default(12),
3497
+ });
3498
+ },
3499
+ },
3500
+ });
3501
+
3502
+ /**
3503
+ * Привязывает мета-информацию о теме к Zod-схеме
3504
+ *
3505
+ * @template Value - Тип значения схемы
3506
+ * @template Theme - Тип темы (по умолчанию ITheme)
3507
+ *
3508
+ * @param scheme - Zod схема для привязки
3509
+ * @param selectThemeValue - Функция, возвращающая значение из темы
3510
+ *
3511
+ * @returns Zod схему с мета-информацией о теме
3512
+ *
3513
+ * @example
3514
+ * // Базовое использование
3515
+ * textSize: themed(
3516
+ * z.number().default(12),
3517
+ * (theme) => theme.textSize
3518
+ * )
3519
+ */
3520
+ var themed = function (scheme, selectThemeValue) {
3521
+ var _a;
3522
+ return scheme.meta((_a = {}, _a[exports.ESettingsSchemaMetaKey.themeValue] = selectThemeValue, _a));
3523
+ };
3524
+
3428
3525
  Object.defineProperty(exports, "ELanguages", {
3429
3526
  enumerable: true,
3430
3527
  get: function () { return localization.ELanguages; }
@@ -3559,7 +3656,9 @@ exports.getMeasureFormula = getMeasureFormula;
3559
3656
  exports.getProcessDimensionValueFormula = getProcessDimensionValueFormula;
3560
3657
  exports.getRuleColor = getRuleColor;
3561
3658
  exports.getTransitionMeasureFormula = getTransitionMeasureFormula;
3659
+ exports.hexToRgb = hexToRgb;
3562
3660
  exports.inheritDisplayConditionFromHierarchy = inheritDisplayConditionFromHierarchy;
3661
+ exports.interpolateHexColor = interpolateHexColor;
3563
3662
  exports.isDimensionProcessFilter = isDimensionProcessFilter;
3564
3663
  exports.isDimensionsHierarchy = isDimensionsHierarchy;
3565
3664
  exports.isFormulaFilterValue = isFormulaFilterValue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infomaximum/widget-sdk",
3
- "version": "7.0.0-15",
3
+ "version": "7.0.0-17",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.esm.js",
6
6
  "types": "./dist/index.d.ts",