@infomaximum/widget-sdk 6.0.0-0 → 6.0.0-10

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
@@ -36,12 +36,6 @@ exports.EViewOpenIn = void 0;
36
36
  EViewOpenIn["PLACEHOLDER"] = "PLACEHOLDER";
37
37
  EViewOpenIn["MODAL_WINDOW"] = "MODAL_WINDOW";
38
38
  EViewOpenIn["DRAWER_WINDOW"] = "DRAWER_WINDOW";
39
- // TODO: удалить при выполении BI-14979
40
- /** @deprecated необходимо использовать EViewOpenIn.WINDOW с флагом newWindow - true */
41
- EViewOpenIn["NEW_WINDOW"] = "NEW_WINDOW";
42
- // TODO: удалить при выполении BI-14979
43
- /** @deprecated необходимо использовать EViewOpenIn.WINDOW с флагом newWindow - false */
44
- EViewOpenIn["CURRENT_WINDOW"] = "CURRENT_WINDOW";
45
39
  })(exports.EViewOpenIn || (exports.EViewOpenIn = {}));
46
40
  exports.EDrawerPlacement = void 0;
47
41
  (function (EDrawerPlacement) {
@@ -139,6 +133,39 @@ function __rest(s, e) {
139
133
  return t;
140
134
  }
141
135
 
136
+ function __values(o) {
137
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
138
+ if (m) return m.call(o);
139
+ if (o && typeof o.length === "number") return {
140
+ next: function () {
141
+ if (o && i >= o.length) o = void 0;
142
+ return { value: o && o[i++], done: !o };
143
+ }
144
+ };
145
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
146
+ }
147
+
148
+ function __read(o, n) {
149
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
150
+ if (!m) return o;
151
+ var i = m.call(o), r, ar = [], e;
152
+ try {
153
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
154
+ }
155
+ catch (error) { e = { error: error }; }
156
+ finally {
157
+ try {
158
+ if (r && !r.done && (m = i["return"])) m.call(i);
159
+ }
160
+ finally { if (e) throw e.error; }
161
+ }
162
+ return ar;
163
+ }
164
+
165
+ function __makeTemplateObject(cooked, raw) {
166
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
167
+ return cooked;
168
+ }
142
169
  typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
143
170
  var e = new Error(message);
144
171
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
@@ -186,9 +213,18 @@ exports.EFormulaFilterFieldKeys = void 0;
186
213
  EFormulaFilterFieldKeys["lastTimeUnit"] = "lastTimeUnit";
187
214
  EFormulaFilterFieldKeys["durationUnit"] = "durationUnit";
188
215
  })(exports.EFormulaFilterFieldKeys || (exports.EFormulaFilterFieldKeys = {}));
216
+ exports.EDimensionProcessFilterTimeUnit = void 0;
217
+ (function (EDimensionProcessFilterTimeUnit) {
218
+ EDimensionProcessFilterTimeUnit["YEARS"] = "YEARS";
219
+ EDimensionProcessFilterTimeUnit["MONTHS"] = "MONTHS";
220
+ EDimensionProcessFilterTimeUnit["HOURS"] = "HOURS";
221
+ EDimensionProcessFilterTimeUnit["DAYS"] = "DAYS";
222
+ EDimensionProcessFilterTimeUnit["MINUTES"] = "MINUTES";
223
+ })(exports.EDimensionProcessFilterTimeUnit || (exports.EDimensionProcessFilterTimeUnit = {}));
189
224
  var isFormulaFilterValue = function (value) {
190
225
  return "filteringMethod" in value;
191
226
  };
227
+ var isDimensionProcessFilter = function (filter) { return "value" in filter && "condition" in filter; };
192
228
 
193
229
  var compact = function (items) { return ((items === null || items === void 0 ? void 0 : items.filter(Boolean)) || []); };
194
230
  var compactMap = function (items, f) {
@@ -613,7 +649,7 @@ var formattingConfig = {
613
649
  },
614
650
  };
615
651
 
616
- var _a$4;
652
+ var _a$5;
617
653
  exports.EDimensionTemplateNames = void 0;
618
654
  (function (EDimensionTemplateNames) {
619
655
  EDimensionTemplateNames["dateTime"] = "dateTime";
@@ -629,19 +665,19 @@ exports.EDimensionTemplateNames = void 0;
629
665
  EDimensionTemplateNames["hour"] = "hour";
630
666
  })(exports.EDimensionTemplateNames || (exports.EDimensionTemplateNames = {}));
631
667
  /** Стандартные шаблоны разреза */
632
- var dimensionTemplateFormulas = (_a$4 = {},
633
- _a$4[exports.EDimensionTemplateNames.dateTime] = "toDateTime({columnFormula})",
634
- _a$4[exports.EDimensionTemplateNames.date] = "toDate({columnFormula})",
635
- _a$4[exports.EDimensionTemplateNames.year] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toYear({columnFormula}))",
636
- _a$4[exports.EDimensionTemplateNames.yearAndQuarter] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toYear({columnFormula}) * 10 + toQuarter({columnFormula}))",
637
- _a$4[exports.EDimensionTemplateNames.quarter] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toQuarter({columnFormula}))",
638
- _a$4[exports.EDimensionTemplateNames.yearAndMonth] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toYYYYMM({columnFormula}))",
639
- _a$4[exports.EDimensionTemplateNames.month] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toMonth({columnFormula}))",
640
- _a$4[exports.EDimensionTemplateNames.dayOfMonth] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toDayOfMonth({columnFormula}))",
641
- _a$4[exports.EDimensionTemplateNames.week] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toWeek({columnFormula}))",
642
- _a$4[exports.EDimensionTemplateNames.dayOfWeek] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toDayOfWeek({columnFormula}))",
643
- _a$4[exports.EDimensionTemplateNames.hour] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toHour({columnFormula}))",
644
- _a$4);
668
+ var dimensionTemplateFormulas = (_a$5 = {},
669
+ _a$5[exports.EDimensionTemplateNames.dateTime] = "toDateTime({columnFormula})",
670
+ _a$5[exports.EDimensionTemplateNames.date] = "toDate({columnFormula})",
671
+ _a$5[exports.EDimensionTemplateNames.year] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toYear({columnFormula}))",
672
+ _a$5[exports.EDimensionTemplateNames.yearAndQuarter] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toYear({columnFormula}) * 10 + toQuarter({columnFormula}))",
673
+ _a$5[exports.EDimensionTemplateNames.quarter] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toQuarter({columnFormula}))",
674
+ _a$5[exports.EDimensionTemplateNames.yearAndMonth] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toYYYYMM({columnFormula}))",
675
+ _a$5[exports.EDimensionTemplateNames.month] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toMonth({columnFormula}))",
676
+ _a$5[exports.EDimensionTemplateNames.dayOfMonth] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toDayOfMonth({columnFormula}))",
677
+ _a$5[exports.EDimensionTemplateNames.week] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toWeek({columnFormula}))",
678
+ _a$5[exports.EDimensionTemplateNames.dayOfWeek] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toDayOfWeek({columnFormula}))",
679
+ _a$5[exports.EDimensionTemplateNames.hour] = "if(defaultValueOfArgumentType({columnFormula}) = {columnFormula}, 0, toHour({columnFormula}))",
680
+ _a$5);
645
681
 
646
682
  exports.EWidgetIndicatorType = void 0;
647
683
  (function (EWidgetIndicatorType) {
@@ -683,6 +719,11 @@ exports.ESortingValueModes = void 0;
683
719
  /** Сортировка по показателю(разрезу или мере) виджета */
684
720
  ESortingValueModes["IN_WIDGET"] = "IN_WIDGET";
685
721
  })(exports.ESortingValueModes || (exports.ESortingValueModes = {}));
722
+ exports.EFormatOrFormattingMode = void 0;
723
+ (function (EFormatOrFormattingMode) {
724
+ EFormatOrFormattingMode["BASE"] = "BASE";
725
+ EFormatOrFormattingMode["TEMPLATE"] = "TEMPLATE";
726
+ })(exports.EFormatOrFormattingMode || (exports.EFormatOrFormattingMode = {}));
686
727
  /** Тип показателя */
687
728
  exports.EIndicatorType = void 0;
688
729
  (function (EIndicatorType) {
@@ -762,24 +803,100 @@ var minTemplate = createAggregationTemplate$1("minIf");
762
803
  var maxTemplate = createAggregationTemplate$1("maxIf");
763
804
  var sumTemplate = createAggregationTemplate$1("sumIf");
764
805
 
806
+ /** @deprecated - следует использовать fillTemplateSql */
765
807
  function fillTemplateString(templateString, params) {
766
- return templateString.replace(/\{(.*?)\}/g, function (_, key) { var _a; return (_a = params[key]) !== null && _a !== void 0 ? _a : ""; });
808
+ return templateString.replace(/\{(.*?)\}/g, function (_, key) {
809
+ var _a;
810
+ return (_a = params[key]) !== null && _a !== void 0 ? _a : "";
811
+ });
812
+ }
813
+ /** Функция для безопасного заполнения SQL шаблонов с защитой от однострочных SQL комментариев в подставляемых значениях. */
814
+ function fillTemplateSql(templateString, params) {
815
+ var e_1, _a;
816
+ var newParams = {};
817
+ try {
818
+ for (var _b = __values(Object.entries(params)), _c = _b.next(); !_c.done; _c = _b.next()) {
819
+ var _d = __read(_c.value, 2), key = _d[0], value = _d[1];
820
+ /** Эвристическая проверка на возможное присутствие sql-комментария в значении подставляемом в template
821
+ */
822
+ if (String(value).indexOf("--") >= 0) {
823
+ newParams[key] = "".concat(value, "\n");
824
+ continue;
825
+ }
826
+ newParams[key] = String(value);
827
+ }
828
+ }
829
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
830
+ finally {
831
+ try {
832
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
833
+ }
834
+ finally { if (e_1) throw e_1.error; }
835
+ }
836
+ return fillTemplateString(templateString, newParams);
837
+ }
838
+
839
+ /** Создать функцию экранирования переданных `specialChars` внутри `str` */
840
+ var createEscaper = function (specialChars) { return function (str) {
841
+ return specialChars.reduce(function (escaped, char) { return escaped.replaceAll(char, "\\".concat(char)); }, str);
842
+ }; };
843
+
844
+ /** Удалить из строки символы экранирования */
845
+ function unescapeSpecialCharacters(str) {
846
+ return str.replace(/\\(?!\\)/g, "").replace(/\\\\/g, "\\");
767
847
  }
768
848
 
769
- /** Функция для экранирования специальных символов
770
- * при подстановке названий таблиц, колонок, переменных или показателей в SQL-формулы.
771
- * Пример: Если название переменной содержит кавычки или обратные слеши,
772
- * например: `te"s\t`, то перед подстановкой в SQL-формулу его следует экранировать.
773
- * Результат должен выглядеть так: `"inputs"."te\"s\\t"`
849
+ /**
850
+ * Создает RegExp-паттерн для подстроки с безопасными символами.
851
+ *
852
+ * Подстрока может содержать любой символ, кроме:
853
+ * 1. `restrictedChar` - запрещено появление без экранирования.
854
+ * 2. Обратного слэша (`\`) - запрещено появление без пары.
855
+ *
856
+ * Правило экранирования:
857
+ * - Любой символ, включая `restrictedChar` и `\`, можно использовать с префиксом `\`.
858
+ * - Последний символ в подстроке не может быть одинокий слэш.
859
+ *
860
+ * @param restrictedChar Символ, который нельзя использовать без экранирования.
861
+ * @returns Строка для вставки внутрь RegExp.
774
862
  */
775
- var escapeSpecialCharacters = function (value) {
776
- return value.replaceAll("\\", "\\\\").replaceAll('"', '\\"');
863
+ var createEscapableCharPattern = function (restrictedChar) {
864
+ return String.raw(templateObject_1 || (templateObject_1 = __makeTemplateObject(["(?:\\.|[^", "\\])*"], ["(?:\\\\.|[^", "\\\\])*"])), restrictedChar);
777
865
  };
866
+ /**
867
+ * Паттерн подстроки, валидной для использования внутри фигурных скобок.
868
+ * Требование к подстроке - отсутствие закрывающих фигурных скобок (кроме экранированных).
869
+ */
870
+ var curlyBracketsContentPattern = createEscapableCharPattern("}");
871
+ /**
872
+ * Паттерн подстроки, валидной для использования внутри двойных кавычек.
873
+ * Требование к подстроке - отсутствие двойных кавычек (кроме экранированных).
874
+ */
875
+ var doubleQuoteContentPattern = createEscapableCharPattern('"');
876
+ var dashboardLinkRegExp = new RegExp(String.raw(templateObject_2 || (templateObject_2 = __makeTemplateObject(["#{(", ")}(?!.{(", ")})"], ["#\\{(", ")\\}(?!\\.\\{(", ")\\})"])), curlyBracketsContentPattern, curlyBracketsContentPattern), "g");
877
+ var workspaceLinkRegExp = new RegExp(String.raw(templateObject_3 || (templateObject_3 = __makeTemplateObject(["#{(", ")}.{(", ")}"], ["#\\{(", ")\\}\\.\\{(", ")\\}"])), curlyBracketsContentPattern, curlyBracketsContentPattern), "g");
878
+ /** Экранирование спец.символов при подстановке названий таблиц и колонок */
879
+ var escapeDoubleQuoteLinkName = createEscaper(Array.from("\\\""));
880
+ /** Экранирование спец.символов при подстановке названий переменных и показателей */
881
+ var escapeCurlyBracketLinkName = createEscaper(Array.from("\\}.[]"));
882
+ var parseIndicatorLink = function (formula) {
883
+ var dashboardMatch = formula.match(dashboardLinkRegExp.source);
884
+ if (dashboardMatch) {
885
+ return { scopeName: null, indicatorName: dashboardMatch[1] };
886
+ }
887
+ var workspaceMatch = formula.match(workspaceLinkRegExp.source);
888
+ if (workspaceMatch) {
889
+ return {
890
+ scopeName: unescapeSpecialCharacters(workspaceMatch[1]),
891
+ indicatorName: unescapeSpecialCharacters(workspaceMatch[2]),
892
+ };
893
+ }
894
+ return null;
895
+ };
896
+ var templateObject_1, templateObject_2, templateObject_3;
778
897
 
779
898
  function generateColumnFormula(tableName, columnName) {
780
- var preparedTableName = escapeSpecialCharacters(tableName);
781
- var preparedColumnName = escapeSpecialCharacters(columnName);
782
- return "\"".concat(preparedTableName, "\".\"").concat(preparedColumnName, "\"");
899
+ return "\"".concat(escapeDoubleQuoteLinkName(tableName), "\".\"").concat(escapeDoubleQuoteLinkName(columnName), "\"");
783
900
  }
784
901
 
785
902
  var escapeSingularQuotes = function (formula) {
@@ -872,7 +989,7 @@ var convertFiltersToFormula = function (filters) {
872
989
  return filters.length > 0 ? " AND ".concat(convertToFormulasChain(filters)) : "";
873
990
  };
874
991
 
875
- var _a$3;
992
+ var _a$4;
876
993
  exports.EDimensionAggregationTemplateName = void 0;
877
994
  (function (EDimensionAggregationTemplateName) {
878
995
  EDimensionAggregationTemplateName["avg"] = "avg";
@@ -889,20 +1006,20 @@ exports.EDimensionAggregationTemplateName = void 0;
889
1006
  EDimensionAggregationTemplateName["countReworks"] = "countReworks";
890
1007
  })(exports.EDimensionAggregationTemplateName || (exports.EDimensionAggregationTemplateName = {}));
891
1008
  /** Шаблоны процессных метрик разреза с режимом AGGREGATION */
892
- var dimensionAggregationTemplates = (_a$3 = {},
893
- _a$3[exports.EDimensionAggregationTemplateName.avg] = avgTemplate,
894
- _a$3[exports.EDimensionAggregationTemplateName.median] = medianTemplate,
895
- _a$3[exports.EDimensionAggregationTemplateName.count] = countTemplate,
896
- _a$3[exports.EDimensionAggregationTemplateName.countDistinct] = countDistinctTemplate,
897
- _a$3[exports.EDimensionAggregationTemplateName.min] = minTemplate,
898
- _a$3[exports.EDimensionAggregationTemplateName.max] = maxTemplate,
899
- _a$3[exports.EDimensionAggregationTemplateName.sum] = sumTemplate,
900
- _a$3[exports.EDimensionAggregationTemplateName.top] = topTemplate,
901
- _a$3[exports.EDimensionAggregationTemplateName.firstValue] = firstValueTemplate,
902
- _a$3[exports.EDimensionAggregationTemplateName.lastValue] = lastValueTemplate,
903
- _a$3[exports.EDimensionAggregationTemplateName.countExecutions] = countExecutionsTemplate,
904
- _a$3[exports.EDimensionAggregationTemplateName.countReworks] = countReworksTemplate,
905
- _a$3);
1009
+ var dimensionAggregationTemplates = (_a$4 = {},
1010
+ _a$4[exports.EDimensionAggregationTemplateName.avg] = avgTemplate,
1011
+ _a$4[exports.EDimensionAggregationTemplateName.median] = medianTemplate,
1012
+ _a$4[exports.EDimensionAggregationTemplateName.count] = countTemplate,
1013
+ _a$4[exports.EDimensionAggregationTemplateName.countDistinct] = countDistinctTemplate,
1014
+ _a$4[exports.EDimensionAggregationTemplateName.min] = minTemplate,
1015
+ _a$4[exports.EDimensionAggregationTemplateName.max] = maxTemplate,
1016
+ _a$4[exports.EDimensionAggregationTemplateName.sum] = sumTemplate,
1017
+ _a$4[exports.EDimensionAggregationTemplateName.top] = topTemplate,
1018
+ _a$4[exports.EDimensionAggregationTemplateName.firstValue] = firstValueTemplate,
1019
+ _a$4[exports.EDimensionAggregationTemplateName.lastValue] = lastValueTemplate,
1020
+ _a$4[exports.EDimensionAggregationTemplateName.countExecutions] = countExecutionsTemplate,
1021
+ _a$4[exports.EDimensionAggregationTemplateName.countReworks] = countReworksTemplate,
1022
+ _a$4);
906
1023
  /** На основе значения режима AGGREGATION подготовить параметры для подстановки в шаблонную формулу */
907
1024
  var prepareDimensionAggregationParams = function (value) {
908
1025
  if (!value.eventName ||
@@ -916,7 +1033,6 @@ var prepareDimensionAggregationParams = function (value) {
916
1033
  eventNameFormula: value.eventNameFormula,
917
1034
  caseCaseIdFormula: value.caseCaseIdFormula,
918
1035
  eventName: value.eventName,
919
- objectFilters: "1",
920
1036
  filters: convertFiltersToFormula(value.filters),
921
1037
  eventTimeFormula: "",
922
1038
  columnFormula: "",
@@ -945,7 +1061,7 @@ var timeTemplates = (function () {
945
1061
  var generateTemplates = function (innerTemplate) {
946
1062
  var templates = {};
947
1063
  for (var key in dimensionTemplateFormulas) {
948
- templates[key] = fillTemplateString(dimensionTemplateFormulas[key], { columnFormula: innerTemplate });
1064
+ templates[key] = fillTemplateSql(dimensionTemplateFormulas[key], { columnFormula: innerTemplate });
949
1065
  }
950
1066
  return templates;
951
1067
  };
@@ -974,7 +1090,7 @@ var prepareTimeParams = function (value) {
974
1090
  };
975
1091
 
976
1092
  function getDimensionFormula(_a) {
977
- var _b;
1093
+ var _b, _c;
978
1094
  var value = _a.value;
979
1095
  if (!value) {
980
1096
  return "";
@@ -988,10 +1104,13 @@ function getDimensionFormula(_a) {
988
1104
  if (!templateFormula || !tableName || !columnName) {
989
1105
  return "";
990
1106
  }
991
- return fillTemplateString(templateFormula, {
1107
+ return fillTemplateSql(templateFormula, {
992
1108
  columnFormula: generateColumnFormula(tableName, columnName),
993
1109
  });
994
1110
  }
1111
+ return (_c = getProcessDimensionValueFormula(value)) !== null && _c !== void 0 ? _c : "";
1112
+ }
1113
+ function getProcessDimensionValueFormula(value) {
995
1114
  if (value.mode === exports.EWidgetIndicatorValueModes.AGGREGATION) {
996
1115
  var preparedParams = prepareDimensionAggregationParams(value);
997
1116
  if (!preparedParams) {
@@ -1001,10 +1120,10 @@ function getDimensionFormula(_a) {
1001
1120
  ? dimensionTemplateFormulas[value.innerTemplateName]
1002
1121
  : null;
1003
1122
  var columnFormula = innerTemplate
1004
- ? fillTemplateString(innerTemplate, { columnFormula: preparedParams.columnFormula })
1123
+ ? fillTemplateSql(innerTemplate, { columnFormula: preparedParams.columnFormula })
1005
1124
  : preparedParams.columnFormula;
1006
1125
  var dimensionAggregationTemplate = dimensionAggregationTemplates[value.templateName];
1007
- return fillTemplateString(dimensionAggregationTemplate, __assign(__assign({}, preparedParams), { columnFormula: columnFormula }));
1126
+ return fillTemplateSql(dimensionAggregationTemplate, __assign(__assign({}, preparedParams), { columnFormula: columnFormula }));
1008
1127
  }
1009
1128
  if (value.mode === exports.EWidgetIndicatorValueModes.START_TIME ||
1010
1129
  value.mode === exports.EWidgetIndicatorValueModes.END_TIME) {
@@ -1013,9 +1132,8 @@ function getDimensionFormula(_a) {
1013
1132
  return "";
1014
1133
  }
1015
1134
  var templateFormula = timeTemplates[value.mode][value.templateName];
1016
- return fillTemplateString(templateFormula, preparedParams);
1135
+ return fillTemplateSql(templateFormula, preparedParams);
1017
1136
  }
1018
- return "";
1019
1137
  }
1020
1138
 
1021
1139
  exports.EMeasureAggregationTemplateName = void 0;
@@ -1035,6 +1153,7 @@ exports.EMeasureAggregationTemplateName = void 0;
1035
1153
  })(exports.EMeasureAggregationTemplateName || (exports.EMeasureAggregationTemplateName = {}));
1036
1154
  /** На основе значения режима AGGREGATION подготовить параметры для подстановки в шаблонную формулу */
1037
1155
  var prepareMeasureAggregationParams = function (value) {
1156
+ var _a;
1038
1157
  if ((!value.anyEvent && !value.eventName) ||
1039
1158
  !value.caseCaseIdFormula ||
1040
1159
  !value.eventNameFormula ||
@@ -1047,8 +1166,7 @@ var prepareMeasureAggregationParams = function (value) {
1047
1166
  outerAggregation: value.outerAggregation,
1048
1167
  eventNameFormula: value.eventNameFormula,
1049
1168
  caseCaseIdFormula: value.caseCaseIdFormula,
1050
- eventName: value.eventName,
1051
- objectFilters: "1",
1169
+ eventName: (_a = value.eventName) !== null && _a !== void 0 ? _a : "",
1052
1170
  filters: convertFiltersToFormula(value.filters),
1053
1171
  eventTimeFormula: "",
1054
1172
  columnFormula: "",
@@ -1069,7 +1187,7 @@ var prepareMeasureAggregationParams = function (value) {
1069
1187
  return columnParams;
1070
1188
  };
1071
1189
 
1072
- var _a$2;
1190
+ var _a$3;
1073
1191
  exports.EMeasureTemplateNames = void 0;
1074
1192
  (function (EMeasureTemplateNames) {
1075
1193
  EMeasureTemplateNames["avg"] = "avg";
@@ -1081,15 +1199,15 @@ exports.EMeasureTemplateNames = void 0;
1081
1199
  EMeasureTemplateNames["sum"] = "sum";
1082
1200
  })(exports.EMeasureTemplateNames || (exports.EMeasureTemplateNames = {}));
1083
1201
  /** Стандартные шаблоны меры */
1084
- var measureTemplateFormulas = (_a$2 = {},
1085
- _a$2[exports.EMeasureTemplateNames.avg] = "avg({columnFormula})",
1086
- _a$2[exports.EMeasureTemplateNames.count] = "count({columnFormula})",
1087
- _a$2[exports.EMeasureTemplateNames.countDistinct] = "count(distinct {columnFormula})",
1088
- _a$2[exports.EMeasureTemplateNames.median] = "medianExact({columnFormula})",
1089
- _a$2[exports.EMeasureTemplateNames.min] = "min({columnFormula})",
1090
- _a$2[exports.EMeasureTemplateNames.max] = "max({columnFormula})",
1091
- _a$2[exports.EMeasureTemplateNames.sum] = "sum({columnFormula})",
1092
- _a$2);
1202
+ var measureTemplateFormulas = (_a$3 = {},
1203
+ _a$3[exports.EMeasureTemplateNames.avg] = "avg({columnFormula})",
1204
+ _a$3[exports.EMeasureTemplateNames.count] = "count({columnFormula})",
1205
+ _a$3[exports.EMeasureTemplateNames.countDistinct] = "count(distinct {columnFormula})",
1206
+ _a$3[exports.EMeasureTemplateNames.median] = "medianExact({columnFormula})",
1207
+ _a$3[exports.EMeasureTemplateNames.min] = "min({columnFormula})",
1208
+ _a$3[exports.EMeasureTemplateNames.max] = "max({columnFormula})",
1209
+ _a$3[exports.EMeasureTemplateNames.sum] = "sum({columnFormula})",
1210
+ _a$3);
1093
1211
 
1094
1212
  /** Шаблон процессной метрики меры с режимом CONVERSION */
1095
1213
  var conversionTemplate = "countIf(\n process(\n minIf(\n {startEventTimeFormula}, \n {startEventNameFormula} = '{startEventName}'{startEventFilters}\n ), \n {endCaseCaseIdFormula}\n ) < \n process(\n maxIf(\n {endEventTimeFormula}, \n {endEventNameFormula} = '{endEventName}'{endEventFilters}\n ), \n {endCaseCaseIdFormula}\n ) \n and \n process(\n countIf(\n {startEventNameFormula} = '{startEventName}'{startEventFilters}\n ) != 0, \n {endCaseCaseIdFormula}\n ) != 0\n) / countIf(\n process(\n countIf(\n {startEventNameFormula} = '{startEventName}'{startEventFilters}\n ) != 0, \n {endCaseCaseIdFormula}\n ) != 0\n)";
@@ -1107,7 +1225,6 @@ var prepareConversionParams = function (value) {
1107
1225
  return null;
1108
1226
  }
1109
1227
  return {
1110
- objectFilters: "1",
1111
1228
  startEventTimeFormula: value.startEventTimeFormula,
1112
1229
  startEventNameFormula: value.startEventNameFormula,
1113
1230
  startEventFilters: convertFiltersToFormula(value.startEventFilters),
@@ -1146,7 +1263,6 @@ var prepareDurationParams = function (value) {
1146
1263
  return appearance === exports.EEventAppearances.FIRST ? "minIf" : "maxIf";
1147
1264
  };
1148
1265
  return {
1149
- objectFilters: "1",
1150
1266
  startEventTimeFormula: value.startEventTimeFormula,
1151
1267
  startEventNameFormula: value.startEventNameFormula,
1152
1268
  startEventFilters: convertFiltersToFormula(value.startEventFilters),
@@ -1162,16 +1278,16 @@ var prepareDurationParams = function (value) {
1162
1278
  };
1163
1279
 
1164
1280
  function createAnyEventTemplate(aggregatePart) {
1165
- return "{outerAggregation}If(process(".concat(aggregatePart, ", {caseCaseIdFormula}), {objectFilters})");
1281
+ return "{outerAggregation}(process(".concat(aggregatePart, ", {caseCaseIdFormula}))");
1166
1282
  }
1167
1283
  function createSpecificEventTemplate(fn, additionalFn) {
1168
- return "{outerAggregation}If(process(".concat(fn, "(").concat(additionalFn ? "".concat(additionalFn, " ") : "", "{columnFormula}, {eventNameFormula} = '{eventName}'{filters}), {caseCaseIdFormula}), {objectFilters})");
1284
+ return "{outerAggregation}(process(".concat(fn, "(").concat(additionalFn ? "".concat(additionalFn, " ") : "", "{columnFormula}, {eventNameFormula} = '{eventName}'{filters}), {caseCaseIdFormula}))");
1169
1285
  }
1170
1286
  function createTopLikeTemplate(template) {
1171
1287
  return function (outerAggregation) {
1172
1288
  return outerAggregation === exports.EOuterAggregation.top
1173
- ? "{outerAggregation}KIf(1)(".concat(template, ", {objectFilters})[1]")
1174
- : "{outerAggregation}If(".concat(template, ", {objectFilters})");
1289
+ ? "{outerAggregation}K(1)(".concat(template, ")[1]")
1290
+ : "{outerAggregation}(".concat(template, ")");
1175
1291
  };
1176
1292
  }
1177
1293
  function createAggregationTemplate(templateName, _a) {
@@ -1218,9 +1334,9 @@ function createAggregationTemplate(templateName, _a) {
1218
1334
  ? createAnyEventTemplate("argMax({columnFormula}, {eventTimeFormula})")
1219
1335
  : createTopLikeTemplate(lastValueTemplate)(outerAggregation);
1220
1336
  case exports.EMeasureAggregationTemplateName.countExecutions:
1221
- return "{outerAggregation}If(".concat(countExecutionsTemplate, ", {objectFilters})");
1337
+ return "{outerAggregation}(".concat(countExecutionsTemplate, ")");
1222
1338
  case exports.EMeasureAggregationTemplateName.countReworks:
1223
- return "{outerAggregation}If(".concat(countReworksTemplate, ", {objectFilters})");
1339
+ return "{outerAggregation}(".concat(countReworksTemplate, ")");
1224
1340
  }
1225
1341
  }
1226
1342
 
@@ -1239,14 +1355,14 @@ function getMeasureFormula(_a) {
1239
1355
  if (!templateFormula || !tableName || !columnName) {
1240
1356
  return "";
1241
1357
  }
1242
- return fillTemplateString(templateFormula, {
1358
+ return fillTemplateSql(templateFormula, {
1243
1359
  columnFormula: generateColumnFormula(tableName, columnName),
1244
1360
  });
1245
1361
  }
1246
1362
  if (value.mode === exports.EWidgetIndicatorValueModes.AGGREGATION) {
1247
1363
  var preparedParams = prepareMeasureAggregationParams(value);
1248
1364
  return preparedParams
1249
- ? fillTemplateString(createAggregationTemplate(value.templateName, {
1365
+ ? fillTemplateSql(createAggregationTemplate(value.templateName, {
1250
1366
  outerAggregation: preparedParams.outerAggregation,
1251
1367
  anyEvent: value.anyEvent,
1252
1368
  }), preparedParams)
@@ -1257,28 +1373,28 @@ function getMeasureFormula(_a) {
1257
1373
  if (!preparedParams) {
1258
1374
  return "";
1259
1375
  }
1260
- return fillTemplateString(conversionTemplate, preparedParams);
1376
+ return fillTemplateSql(conversionTemplate, preparedParams);
1261
1377
  }
1262
1378
  if (value.mode === exports.EWidgetIndicatorValueModes.DURATION) {
1263
1379
  var preparedParams = prepareDurationParams(value);
1264
1380
  if (!preparedParams) {
1265
1381
  return "";
1266
1382
  }
1267
- return fillTemplateString(durationTemplates[value.templateName], preparedParams);
1383
+ return fillTemplateSql(durationTemplates[value.templateName], preparedParams);
1268
1384
  }
1269
1385
  return "";
1270
1386
  }
1271
1387
 
1272
- var _a$1;
1388
+ var _a$2;
1273
1389
  exports.EEventMeasureTemplateNames = void 0;
1274
1390
  (function (EEventMeasureTemplateNames) {
1275
1391
  EEventMeasureTemplateNames["eventsCount"] = "eventsCount";
1276
1392
  EEventMeasureTemplateNames["reworksCount"] = "reworksCount";
1277
1393
  })(exports.EEventMeasureTemplateNames || (exports.EEventMeasureTemplateNames = {}));
1278
- var eventMeasureTemplateFormulas = (_a$1 = {},
1279
- _a$1[exports.EEventMeasureTemplateNames.eventsCount] = "count()",
1280
- _a$1[exports.EEventMeasureTemplateNames.reworksCount] = "count() - uniqExact({caseCaseIdFormula})",
1281
- _a$1);
1394
+ var eventMeasureTemplateFormulas = (_a$2 = {},
1395
+ _a$2[exports.EEventMeasureTemplateNames.eventsCount] = "count()",
1396
+ _a$2[exports.EEventMeasureTemplateNames.reworksCount] = "count() - uniqExact({caseCaseIdFormula})",
1397
+ _a$2);
1282
1398
 
1283
1399
  function getEventMeasureFormula(_a, process) {
1284
1400
  var value = _a.value;
@@ -1290,21 +1406,21 @@ function getEventMeasureFormula(_a, process) {
1290
1406
  }
1291
1407
  if (value.mode === exports.EWidgetIndicatorValueModes.TEMPLATE) {
1292
1408
  var templateFormula = eventMeasureTemplateFormulas[value.templateName];
1293
- return templateFormula && fillTemplateString(templateFormula, process);
1409
+ return templateFormula && fillTemplateSql(templateFormula, process);
1294
1410
  }
1295
1411
  return "";
1296
1412
  }
1297
1413
 
1298
- var _a;
1414
+ var _a$1;
1299
1415
  exports.ETransitionMeasureTemplateNames = void 0;
1300
1416
  (function (ETransitionMeasureTemplateNames) {
1301
1417
  ETransitionMeasureTemplateNames["transitionsCount"] = "transitionsCount";
1302
1418
  ETransitionMeasureTemplateNames["medianTime"] = "medianTime";
1303
1419
  })(exports.ETransitionMeasureTemplateNames || (exports.ETransitionMeasureTemplateNames = {}));
1304
- var transitionMeasureTemplateFormulas = (_a = {},
1305
- _a[exports.ETransitionMeasureTemplateNames.transitionsCount] = "count()",
1306
- _a[exports.ETransitionMeasureTemplateNames.medianTime] = "medianExact(date_diff(second, begin({eventTimeFormula}), end({eventTimeFormula})))",
1307
- _a);
1420
+ var transitionMeasureTemplateFormulas = (_a$1 = {},
1421
+ _a$1[exports.ETransitionMeasureTemplateNames.transitionsCount] = "count()",
1422
+ _a$1[exports.ETransitionMeasureTemplateNames.medianTime] = "medianExact(date_diff(second, begin({eventTimeFormula}), end({eventTimeFormula})))",
1423
+ _a$1);
1308
1424
 
1309
1425
  function getTransitionMeasureFormula(_a, process) {
1310
1426
  var value = _a.value;
@@ -1316,52 +1432,16 @@ function getTransitionMeasureFormula(_a, process) {
1316
1432
  }
1317
1433
  if (value.mode === exports.EWidgetIndicatorValueModes.TEMPLATE) {
1318
1434
  var templateFormula = transitionMeasureTemplateFormulas[value.templateName];
1319
- return templateFormula && fillTemplateString(templateFormula, process);
1435
+ return templateFormula && fillTemplateSql(templateFormula, process);
1320
1436
  }
1321
1437
  return "";
1322
1438
  }
1323
1439
 
1324
- /** Удалить из строки символы экранирования */
1325
- function unescapeSpecialCharacters(str) {
1326
- return str.replace(/\\(?!\\)/g, "").replace(/\\\\/g, "\\");
1327
- }
1328
-
1329
- /**
1330
- * Регулярное выражение для поиска имени ссылки внутри формулы.
1331
- * Учитывает, что имя внутри формулы содержит экраны.
1332
- *
1333
- * Принцип работы:
1334
- * Пробовать следующие вхождения:
1335
- * - \\\\ - экранированный символ обратного слэша.
1336
- * - Иначе \\" - экранированный символ кавычки.
1337
- * - Иначе [^"] - любой символ кроме кавычки.
1338
- * Если встречается любой другой символ, то это закрывающая кавычка имени переменной.
1339
- */
1340
- var linkNameRegExp = "(?:\\\\\\\\|\\\\\"|[^\"])+";
1341
- var dashboardLinkRegExp = new RegExp("link: \"(".concat(linkNameRegExp, ")\"(?!\\.\"").concat(linkNameRegExp, "\")"), "g");
1342
- var workspaceLinkRegExp = new RegExp("link: \"(".concat(linkNameRegExp, ")\"\\.\"(").concat(linkNameRegExp, ")\""), "g");
1343
- var parseIndicatorLink = function (formula) {
1344
- var dashboardMatch = formula.match(dashboardLinkRegExp.source);
1345
- if (dashboardMatch) {
1346
- return { scopeName: null, indicatorName: dashboardMatch[1] };
1347
- }
1348
- var workspaceMatch = formula.match(workspaceLinkRegExp.source);
1349
- if (workspaceMatch) {
1350
- return {
1351
- scopeName: unescapeSpecialCharacters(workspaceMatch[1]),
1352
- indicatorName: unescapeSpecialCharacters(workspaceMatch[2]),
1353
- };
1354
- }
1355
- return null;
1356
- };
1357
-
1358
1440
  // Типы, используемые в значениях элементов управления.
1359
1441
  exports.EWidgetFilterMode = void 0;
1360
1442
  (function (EWidgetFilterMode) {
1361
1443
  EWidgetFilterMode["DEFAULT"] = "DEFAULT";
1362
1444
  EWidgetFilterMode["SINGLE"] = "SINGLE";
1363
- /** @deprecated Отказ от режима фильтрации "Множественный выбор"*/
1364
- EWidgetFilterMode["MULTI"] = "MULTI";
1365
1445
  EWidgetFilterMode["DISABLED"] = "DISABLED";
1366
1446
  })(exports.EWidgetFilterMode || (exports.EWidgetFilterMode = {}));
1367
1447
  exports.EMarkdownDisplayMode = void 0;
@@ -1544,7 +1624,7 @@ var mapFormulaFilterToCalculatorInput = function (filterValue) {
1544
1624
  if (!isFormulaFilterValue(filterValue)) {
1545
1625
  return {
1546
1626
  dbDataType: exports.EClickHouseBaseTypes.Bool,
1547
- formula: fillTemplateString(displayConditionTemplate, {
1627
+ formula: fillTemplateSql(displayConditionTemplate, {
1548
1628
  formula: prepareFormulaForSql(filterValue.formula),
1549
1629
  }),
1550
1630
  values: ["true"],
@@ -1579,6 +1659,46 @@ var mapFormulaFiltersToInputs = function (filters) {
1579
1659
  return compactMap(filters, mapFormulaFilterToCalculatorInput);
1580
1660
  };
1581
1661
 
1662
+ var _a;
1663
+ var intervalByUnit = (_a = {},
1664
+ _a[exports.EDimensionProcessFilterTimeUnit.YEARS] = "year",
1665
+ _a[exports.EDimensionProcessFilterTimeUnit.MONTHS] = "month",
1666
+ _a[exports.EDimensionProcessFilterTimeUnit.DAYS] = "day",
1667
+ _a[exports.EDimensionProcessFilterTimeUnit.HOURS] = "hour",
1668
+ _a[exports.EDimensionProcessFilterTimeUnit.MINUTES] = "minute",
1669
+ _a);
1670
+ function mapDimensionProcessFilterToCalculatorInput(filter) {
1671
+ var formula = filter.value.mode === exports.EWidgetIndicatorValueModes.FORMULA
1672
+ ? filter.value.formula
1673
+ : getProcessDimensionValueFormula(filter.value);
1674
+ if (formula === undefined) {
1675
+ throw new Error("Formula generation error");
1676
+ }
1677
+ var _a = filter.condition, timeUnit = _a.timeUnit, filteringMethod = _a.filteringMethod, values = _a.values;
1678
+ if (filteringMethod === "LAST_TIME") {
1679
+ if (!timeUnit) {
1680
+ throw new Error("Missing time unit");
1681
+ }
1682
+ return {
1683
+ dbDataType: exports.EClickHouseBaseTypes.Bool,
1684
+ formula: "date_diff('".concat(intervalByUnit[timeUnit], "', ").concat(formula, ", now())"),
1685
+ values: values,
1686
+ filteringMethod: formulaFilterMethods.LESS_THAN_OR_EQUAL_TO,
1687
+ };
1688
+ }
1689
+ return { formula: formula, filteringMethod: filteringMethod, values: values, dbDataType: filter.dbDataType };
1690
+ }
1691
+
1692
+ var mapSettingsFilterToCalculatorInput = function (filter) {
1693
+ if (isDimensionProcessFilter(filter)) {
1694
+ return mapDimensionProcessFilterToCalculatorInput(filter);
1695
+ }
1696
+ return mapFormulaFilterToCalculatorInput(filter);
1697
+ };
1698
+ var mapSettingsFiltersToInputs = function (filters) {
1699
+ return compactMap(filters, mapSettingsFilterToCalculatorInput);
1700
+ };
1701
+
1582
1702
  function mapMeasureToInput(measure, variables, addFormulas) {
1583
1703
  if (addFormulas === void 0) { addFormulas = function () { return new Map(); }; }
1584
1704
  var mainFormula = getMeasureFormula(measure);
@@ -1720,7 +1840,8 @@ var getDefaultSortOrders = function (_a) {
1720
1840
  }
1721
1841
  /** Если есть временной разрез, то авто-сортировка по первому такому разрезу (по возрастанию) */
1722
1842
  var timeDimension = dimensions.find(function (dimension) {
1723
- return dimension.format &&
1843
+ var _a;
1844
+ return ((_a = dimension.format) === null || _a === void 0 ? void 0 : _a.value) &&
1724
1845
  [
1725
1846
  exports.EFormatTypes.DATE,
1726
1847
  exports.EFormatTypes.MONTH,
@@ -1733,7 +1854,7 @@ var getDefaultSortOrders = function (_a) {
1733
1854
  exports.EFormatTypes.QUARTER_YEAR,
1734
1855
  exports.EFormatTypes.DAY_OF_MONTH,
1735
1856
  exports.EFormatTypes.WEEK,
1736
- ].includes(dimension.format);
1857
+ ].includes(dimension.format.value);
1737
1858
  });
1738
1859
  if (timeDimension) {
1739
1860
  return [
@@ -1837,6 +1958,8 @@ exports.EControlType = void 0;
1837
1958
  (function (EControlType) {
1838
1959
  /** Ввод текста */
1839
1960
  EControlType["input"] = "input";
1961
+ /** Ввод текста с поддержкой шаблонной вставки сущностей */
1962
+ EControlType["inputTemplate"] = "inputTemplate";
1840
1963
  /** Ввод текста в формате markdown */
1841
1964
  EControlType["inputMarkdown"] = "inputMarkdown";
1842
1965
  /** Ввод числа */
@@ -1950,19 +2073,6 @@ var updateSingleModeSelection = function (selection, formula, value) {
1950
2073
  replacedFilter: null,
1951
2074
  });
1952
2075
  };
1953
- /** @deprecated Отказ от режима фильтрации "Множественный выбор"*/
1954
- var updateMultiModeSelection = function (selection, formula, value) {
1955
- var _a;
1956
- var selectionItemValues = getSelectionItemValues(value, exports.EWidgetFilterMode.MULTI, (_a = selection.get(formula)) === null || _a === void 0 ? void 0 : _a.values);
1957
- if (!selectionItemValues.size) {
1958
- selection.delete(formula);
1959
- return;
1960
- }
1961
- selection.set(formula, {
1962
- values: selectionItemValues,
1963
- replacedFilter: null,
1964
- });
1965
- };
1966
2076
  var replaceFiltersBySelection = function (filters, selection) {
1967
2077
  return filters.reduce(function (acc, filter) {
1968
2078
  var _a;
@@ -2102,14 +2212,19 @@ exports.conversionTemplate = conversionTemplate;
2102
2212
  exports.convertFiltersToFormula = convertFiltersToFormula;
2103
2213
  exports.convertToFormulasChain = convertToFormulasChain;
2104
2214
  exports.countExecutionsTemplate = countExecutionsTemplate;
2215
+ exports.createEscaper = createEscaper;
2105
2216
  exports.createMeasureAggregationTemplate = createAggregationTemplate;
2217
+ exports.curlyBracketsContentPattern = curlyBracketsContentPattern;
2106
2218
  exports.dashboardLinkRegExp = dashboardLinkRegExp;
2107
2219
  exports.dimensionAggregationTemplates = dimensionAggregationTemplates;
2108
2220
  exports.dimensionTemplateFormulas = dimensionTemplateFormulas;
2109
2221
  exports.displayConditionTemplate = displayConditionTemplate;
2222
+ exports.doubleQuoteContentPattern = doubleQuoteContentPattern;
2110
2223
  exports.durationTemplates = durationTemplates;
2111
- exports.escapeSpecialCharacters = escapeSpecialCharacters;
2224
+ exports.escapeCurlyBracketLinkName = escapeCurlyBracketLinkName;
2225
+ exports.escapeDoubleQuoteLinkName = escapeDoubleQuoteLinkName;
2112
2226
  exports.eventMeasureTemplateFormulas = eventMeasureTemplateFormulas;
2227
+ exports.fillTemplateSql = fillTemplateSql;
2113
2228
  exports.fillTemplateString = fillTemplateString;
2114
2229
  exports.formattingConfig = formattingConfig;
2115
2230
  exports.formulaFilterMethods = formulaFilterMethods;
@@ -2121,17 +2236,19 @@ exports.getDisplayConditionFormula = getDisplayConditionFormula;
2121
2236
  exports.getEventMeasureFormula = getEventMeasureFormula;
2122
2237
  exports.getLocalizedText = getLocalizedText;
2123
2238
  exports.getMeasureFormula = getMeasureFormula;
2239
+ exports.getProcessDimensionValueFormula = getProcessDimensionValueFormula;
2124
2240
  exports.getRuleColor = getRuleColor;
2125
2241
  exports.getTransitionMeasureFormula = getTransitionMeasureFormula;
2242
+ exports.isDimensionProcessFilter = isDimensionProcessFilter;
2126
2243
  exports.isDimensionsHierarchy = isDimensionsHierarchy;
2127
2244
  exports.isFormulaFilterValue = isFormulaFilterValue;
2128
2245
  exports.isValidColor = isValidColor;
2129
- exports.linkNameRegExp = linkNameRegExp;
2130
2246
  exports.mapDimensionsToInputs = mapDimensionsToInputs;
2131
2247
  exports.mapEventMeasuresToInputs = mapEventMeasuresToInputs;
2132
2248
  exports.mapFormulaFilterToCalculatorInput = mapFormulaFilterToCalculatorInput;
2133
2249
  exports.mapFormulaFiltersToInputs = mapFormulaFiltersToInputs;
2134
2250
  exports.mapMeasuresToInputs = mapMeasuresToInputs;
2251
+ exports.mapSettingsFiltersToInputs = mapSettingsFiltersToInputs;
2135
2252
  exports.mapSortingToInputs = mapSortingToInputs;
2136
2253
  exports.mapTransitionMeasuresToInputs = mapTransitionMeasuresToInputs;
2137
2254
  exports.measureTemplateFormulas = measureTemplateFormulas;
@@ -2153,6 +2270,5 @@ exports.timeTemplates = timeTemplates;
2153
2270
  exports.transitionMeasureTemplateFormulas = transitionMeasureTemplateFormulas;
2154
2271
  exports.unescapeSpecialCharacters = unescapeSpecialCharacters;
2155
2272
  exports.updateDefaultModeSelection = updateDefaultModeSelection;
2156
- exports.updateMultiModeSelection = updateMultiModeSelection;
2157
2273
  exports.updateSingleModeSelection = updateSingleModeSelection;
2158
2274
  exports.workspaceLinkRegExp = workspaceLinkRegExp;