@qrvey/utils 1.11.0 → 1.12.0-0-chart-v2-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/charts/adapters/chartBuilderAdapter.d.ts +35 -0
  2. package/dist/charts/adapters/chartBuilderAdapter.js +647 -0
  3. package/dist/charts/adapters/chartBuilderDefinitions.d.ts +568 -0
  4. package/dist/charts/adapters/chartBuilderDefinitions.js +31 -0
  5. package/dist/charts/adapters/chartBuilderParse.d.ts +9 -0
  6. package/dist/charts/adapters/chartBuilderParse.js +416 -0
  7. package/dist/charts/adapters/index.d.ts +1 -0
  8. package/dist/charts/adapters/index.js +1 -0
  9. package/dist/charts/helpers/chartBuilder.d.ts +53 -0
  10. package/dist/charts/helpers/chartBuilder.js +190 -0
  11. package/dist/cjs/charts/adapters/chartBuilderAdapter.d.ts +35 -0
  12. package/dist/cjs/charts/adapters/chartBuilderAdapter.js +654 -0
  13. package/dist/cjs/charts/adapters/chartBuilderDefinitions.d.ts +568 -0
  14. package/dist/cjs/charts/adapters/chartBuilderDefinitions.js +34 -0
  15. package/dist/cjs/charts/adapters/chartBuilderParse.d.ts +9 -0
  16. package/dist/cjs/charts/adapters/chartBuilderParse.js +421 -0
  17. package/dist/cjs/charts/adapters/index.d.ts +1 -0
  18. package/dist/cjs/charts/adapters/index.js +1 -0
  19. package/dist/cjs/charts/helpers/chartBuilder.d.ts +53 -0
  20. package/dist/cjs/charts/helpers/chartBuilder.js +212 -0
  21. package/dist/cjs/globalization/interfaces/chart_builder/II18nChartBuilderAxisStyle.d.ts +4 -0
  22. package/dist/cjs/globalization/interfaces/common/II18nRelativeDates.d.ts +8 -0
  23. package/dist/cjs/globalization/interfaces/common/II18nRelativeDates.js +2 -0
  24. package/dist/cjs/globalization/interfaces/common/II18nUnits.d.ts +6 -0
  25. package/dist/cjs/globalization/labels/chart_builder/I18N_CHART_BUILDER_STYLE_OPTIONS.js +4 -0
  26. package/dist/cjs/globalization/labels/common/I18N_COMMON.js +2 -10
  27. package/dist/cjs/globalization/labels/common/I18N_RELATIVE_DATES.d.ts +2 -0
  28. package/dist/cjs/globalization/labels/common/I18N_RELATIVE_DATES.js +11 -0
  29. package/dist/globalization/interfaces/chart_builder/II18nChartBuilderAxisStyle.d.ts +4 -0
  30. package/dist/globalization/interfaces/common/II18nRelativeDates.d.ts +8 -0
  31. package/dist/globalization/interfaces/common/II18nRelativeDates.js +1 -0
  32. package/dist/globalization/interfaces/common/II18nUnits.d.ts +6 -0
  33. package/dist/globalization/labels/chart_builder/I18N_CHART_BUILDER_STYLE_OPTIONS.js +4 -0
  34. package/dist/globalization/labels/common/I18N_COMMON.js +2 -10
  35. package/dist/globalization/labels/common/I18N_RELATIVE_DATES.d.ts +2 -0
  36. package/dist/globalization/labels/common/I18N_RELATIVE_DATES.js +8 -0
  37. package/package.json +1 -1
@@ -0,0 +1,654 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTrendsChartsConfig = exports.getPanelConfig = exports.fromV2ToV1 = exports.buildChartBodyV1 = void 0;
4
+ const chartBuilder_1 = require("../helpers/chartBuilder");
5
+ const chartBuilderParse_1 = require("./chartBuilderParse");
6
+ /**
7
+ * The function `buildChartBodyV1` checks if the input body is already in version 2 format, and if not,
8
+ * converts it from version 2 to version 1.
9
+ * @param {any} body - The `body` parameter is of type `any`, which means it can be any data type.
10
+ * @returns either the original `body` if it has a property `v2`, or the result of calling the
11
+ * `fromV2ToV1` function with `body` as the argument and `false` as the second argument.
12
+ */
13
+ function buildChartBodyV1(body) {
14
+ if (body.v2)
15
+ return body;
16
+ return fromV2ToV1(body, false);
17
+ }
18
+ exports.buildChartBodyV1 = buildChartBodyV1;
19
+ /**
20
+ * The function `fromV2ToV1` converts a V2 chart object to a V1 chart object in TypeScript.
21
+ * @param {any} opts - The `opts` parameter is an object that contains various settings and
22
+ * configurations for a chart. It is optional and has a default value of an empty object `{}`.
23
+ * @param [inPreviewMode=true] - The `inPreviewMode` parameter is a boolean value that indicates
24
+ * whether the function is being called in preview mode or not. It is set to `true` by default.
25
+ * @returns the variable `data`.
26
+ */
27
+ function fromV2ToV1(opts = {}, inPreviewMode = true) {
28
+ var _a, _b;
29
+ if (!(opts === null || opts === void 0 ? void 0 : opts.stylesSettings) ||
30
+ (((0, chartBuilder_1.isChartMetric)(opts.type) || (0, chartBuilder_1.isChartMinMax)(opts.type)) &&
31
+ (0, chartBuilder_1._isEmpty)(opts.dimensions.values))) {
32
+ return;
33
+ }
34
+ const objCopy = (0, chartBuilder_1._cloneDeep)(opts);
35
+ const chart_ms = [
36
+ "BAR_CHART_MS" /* CHART_TYPE.BAR_CHART_MS */,
37
+ "LINE_CHART_MS" /* CHART_TYPE.LINE_CHART_MS */,
38
+ "SYMBOL_CHART_MS" /* CHART_TYPE.SYMBOL_CHART_MS */,
39
+ ];
40
+ const chart_cb = [...chart_ms, "COMBO_CHART" /* CHART_TYPE.COMBO_CHART */];
41
+ const chart_base = [
42
+ "BAR_CHART" /* CHART_TYPE.BAR_CHART */,
43
+ "LINE_CHART" /* CHART_TYPE.LINE_CHART */,
44
+ "SYMBOL_CHART" /* CHART_TYPE.SYMBOL_CHART */,
45
+ "MINMAX_CHART" /* CHART_TYPE.MINMAX_CHART */,
46
+ "FUNNEL_CHART" /* CHART_TYPE.FUNNEL_CHART */,
47
+ ];
48
+ const bar_type = objCopy.stylesSettings.bar_type;
49
+ objCopy.bar_width = objCopy.stylesSettings.bar_width;
50
+ objCopy.isMulti = (0, chartBuilder_1.isChartMultiserie)(objCopy.type);
51
+ objCopy.isChartOptions = [...chart_base, ...chart_cb].includes(objCopy.type);
52
+ objCopy.isCombolayer = [
53
+ "COMBO_CHART" /* CHART_TYPE.COMBO_CHART */,
54
+ "COMBINED_CHART" /* CHART_TYPE.COMBINED_CHART */,
55
+ ].includes(objCopy.type);
56
+ objCopy.isReference = (0, chartBuilder_1.hasReferenceLayer)((_a = opts === null || opts === void 0 ? void 0 : opts.dimensions) === null || _a === void 0 ? void 0 : _a.reference);
57
+ objCopy.isTrend =
58
+ objCopy.type !== "MINMAX_CHART" /* CHART_TYPE.MINMAX_CHART */ &&
59
+ (0, chartBuilder_1.hasTrendLayer)((_b = opts === null || opts === void 0 ? void 0 : opts.dimensions) === null || _b === void 0 ? void 0 : _b.trend);
60
+ const isBarMs = objCopy.isMulti && objCopy.type === "BAR_CHART_MS" /* CHART_TYPE.BAR_CHART_MS */;
61
+ objCopy.is100 = isBarMs && bar_type === "h100" /* BAR_TYPE.FULL */;
62
+ objCopy.isCombo =
63
+ objCopy.isTrend ||
64
+ objCopy.isMulti ||
65
+ objCopy.isCombolayer ||
66
+ objCopy.isReference;
67
+ objCopy.isComboCalc = objCopy.isCombolayer;
68
+ objCopy.isStakedBar =
69
+ (isBarMs || objCopy.isCombo) &&
70
+ (objCopy.is100 || bar_type === "Stacked" /* BAR_TYPE.STACKED */) &&
71
+ objCopy.type !== "BAR_CHART" /* CHART_TYPE.BAR_CHART */;
72
+ objCopy.isSmallMultiples =
73
+ [...chart_base, ...chart_cb].includes(objCopy.type) &&
74
+ objCopy.type !== "FUNNEL_CHART" /* CHART_TYPE.FUNNEL_CHART */ &&
75
+ (0, chartBuilder_1.hasSmallMultiple)(opts.dimensions.smallmultiple);
76
+ const layerList = getLayerList(objCopy);
77
+ if (!layerList)
78
+ return;
79
+ const data = getPanelBodyByChart(objCopy.type, objCopy, layerList, inPreviewMode);
80
+ data.v2 = opts;
81
+ return data;
82
+ }
83
+ exports.fromV2ToV1 = fromV2ToV1;
84
+ function getPanelBodyByChart(chart, obj, layerList, inPreviewMode) {
85
+ let panelBody = Object.assign(Object.assign({}, (0, chartBuilder_1._pick)(obj, [
86
+ "title",
87
+ "name",
88
+ "metricid",
89
+ "chartid",
90
+ "type",
91
+ "position",
92
+ "createDate",
93
+ "modifyDate",
94
+ "dataSet",
95
+ "isOldChart",
96
+ "isMulti",
97
+ "bar_width",
98
+ "isComboCalc",
99
+ ])), { globalSettings: getGlobalSettings(obj.type, obj), preFilters: obj.preFilters || [], defaultFilters: obj.defaultFilters || {}, oldInternalFilters: obj.oldInternalFilters, dateGroup: (0, chartBuilder_1._get)(layerList[0], "dateGroup"), timeGroup: (0, chartBuilder_1._get)(layerList[0], "timeGroup"), layerList });
100
+ panelBody.name = obj.name || obj.title; // Retro for metrics
101
+ panelBody.dataset = obj.dataset; // AT Retro
102
+ switch (chart) {
103
+ case "BOXWHISKER_CHART" /* CHART_TYPE.BOXWHISKER_CHART */:
104
+ panelBody.globalSettings.sortX = {
105
+ type: "Label" /* ACTION_SORT.LABEL */,
106
+ order: "Asc" /* ACTION_SORT_DIR.ASC */,
107
+ }; // remove when box and whishker support sorting by UI settings
108
+ break;
109
+ case "CROSSTAB_CHART" /* CHART_TYPE.CROSSTAB_CHART */:
110
+ panelBody = Object.assign(Object.assign({}, panelBody), { chart: getCrosstabConfig(obj) });
111
+ break;
112
+ case "EXPANDABLE_TABLE_CHART" /* CHART_TYPE.EXPANDABLE_TABLE_CHART */:
113
+ case "TABLE_CHART" /* CHART_TYPE.TABLE_CHART */: {
114
+ const isSimpleTable = !obj.dimensions["categories" /* CHART_DIMENSION.CATEGORIES */].length;
115
+ const attrMax = isSimpleTable
116
+ ? "globalSettings.max_rows.value"
117
+ : "globalSettings.max_groups.value";
118
+ const maxRecords = (0, chartBuilder_1._get)(obj, attrMax);
119
+ panelBody = Object.assign(Object.assign({}, panelBody), { globalSettings: Object.assign(Object.assign({}, panelBody.globalSettings), { maxRecords }), chart: getTableConfig(obj, inPreviewMode) });
120
+ break;
121
+ }
122
+ case "INDICATOR" /* CHART_TYPE.INDICATOR_METRIC */:
123
+ case "DIAL" /* CHART_TYPE.DIAL_METRIC */:
124
+ case "BULLET" /* CHART_TYPE.BULLET_METRIC */: {
125
+ const { comparison } = (0, chartBuilder_1._cloneDeep)(obj.dimensions);
126
+ panelBody = Object.assign(Object.assign(Object.assign({}, panelBody), { globalSettings: Object.assign(Object.assign({}, panelBody.globalSettings), {
127
+ // TODO: Rebase this implementation to refactor
128
+ comparisonType: (0, chartBuilder_1._get)(comparison, "[0].comparison.type", "CHANGE" /* COMPARISON_TYPE.CHANGE */) }) }), getMetricConfigData(chart, obj));
129
+ break;
130
+ }
131
+ case "GEO_CHART_DOT" /* CHART_TYPE.GEO_CHART_DOT */:
132
+ case "GEO_CHART_BUBBLE" /* CHART_TYPE.GEO_CHART_BUBBLE */:
133
+ case "GEO_CHART_CHOROPLETH" /* CHART_TYPE.GEO_CHART_CHOROPLETH */:
134
+ panelBody = Object.assign(Object.assign({}, panelBody), { isSmallMultiples: obj.isSmallMultiples, chart: getGeoMapConfig(obj) });
135
+ break;
136
+ default:
137
+ panelBody = Object.assign(Object.assign({}, panelBody), { isChartOptions: true, isCombolayer: obj.isCombolayer, isReference: obj.isReference, isMulti: obj.isMulti, isCombo: obj.isCombo, isSmallMultiples: obj.isSmallMultiples, isTrend: obj.isTrend, is100: obj.is100, isStakedBar: obj.isStakedBar, isSplit: false });
138
+ break;
139
+ }
140
+ return panelBody;
141
+ }
142
+ function getPanelConfig(config = {}, opts = {}) {
143
+ return Object.assign(Object.assign({}, config), { type: getPanelType(opts.type), inBuilder: true, editable: true, panel: {
144
+ header: { visible: false },
145
+ body: { hasOverlay: false },
146
+ }, previewFilters: (0, chartBuilder_1._get)(config, "filterData.logic"), data: fromV2ToV1(Object.assign(Object.assign({}, opts), { appid: config.app_id || config.appid })) });
147
+ }
148
+ exports.getPanelConfig = getPanelConfig;
149
+ function getPanelType(chart) {
150
+ return [
151
+ "INDICATOR" /* CHART_TYPE.INDICATOR_METRIC */,
152
+ "DIAL" /* CHART_TYPE.DIAL_METRIC */,
153
+ "BULLET" /* CHART_TYPE.BULLET_METRIC */,
154
+ ].includes(chart)
155
+ ? "METRIC"
156
+ : "CHART";
157
+ }
158
+ function getMetricConfigData(chart, obj) {
159
+ const { values, thresholds, comparison } = (0, chartBuilder_1._cloneDeep)(obj.dimensions);
160
+ let data = {
161
+ value: Object.assign(Object.assign({}, values[0]), { property: parsePropertyComplexData(values[0]) }),
162
+ dataSet: {},
163
+ valueAggregate: values[0] && values[0].aggregate,
164
+ };
165
+ if ((0, chartBuilder_1._get)(comparison, "[0]")) {
166
+ const dateColumn = Object.assign({}, comparison[0]);
167
+ const config = dateColumn.comparison;
168
+ delete dateColumn.comparison;
169
+ data = Object.assign(Object.assign({}, data), { dateColumn, timePeriod: chartBuilder_1.timePeriod.find((tp) => tp.label === config.time_period.value), comparison: chartBuilder_1.timePeriod.find((tp) => tp.label === config.time_comparison.value) });
170
+ if (config.time_period.value === "CUSTOM_RANGE" /* TIME_PERIOD.CUSTOM_RANGE */) {
171
+ data = Object.assign(Object.assign({}, data), { timePeriodCustomRange: chartBuilder_1.timePeriodCustomRange.find((tpc) => tpc.label === config.time_period.range), timePeriodDate: config.time_period.start, timePeriodEndDate: config.time_period.end });
172
+ }
173
+ if (config.time_comparison.value === "CUSTOM_RANGE" /* TIME_PERIOD.CUSTOM_RANGE */) {
174
+ data = Object.assign(Object.assign({}, data), { comparisonCustomRange: chartBuilder_1.timePeriodCustomRange.find((tpc) => tpc.label === config.time_comparison.range), comparisonDate: config.time_comparison.start, comparisonEndDate: config.time_comparison.end });
175
+ }
176
+ }
177
+ return {
178
+ appid: obj.appid,
179
+ type: { label: chart },
180
+ thresholdsList: thresholds === null || thresholds === void 0 ? void 0 : thresholds.map((thr) => ({
181
+ label: thr.custom_label || thr.label,
182
+ color: thr.color,
183
+ operator: { label: thr.operator },
184
+ value: thr.value,
185
+ initValue: thr.value,
186
+ endValue: thr.max_value,
187
+ })),
188
+ data,
189
+ individualSettings: (0, chartBuilderParse_1.parseStyleSettingByType)(chart, obj),
190
+ dataset: data.dataSet,
191
+ };
192
+ }
193
+ function getLayerList(opts) {
194
+ if (!isValidData(opts)) {
195
+ return;
196
+ }
197
+ const dimensions = (0, chartBuilder_1._cloneDeep)(opts.dimensions);
198
+ let list = [];
199
+ /** ******* Categort/Value based charts **********/
200
+ const category = getCategory(dimensions, opts);
201
+ const valueColumn = getValue(category, dimensions, opts);
202
+ const dateGroup = category && (0, chartBuilder_1.isColumnDate)(category) && category.dateGroup
203
+ ? category.dateGroup
204
+ : undefined;
205
+ const timeGroup = category && (0, chartBuilder_1.isTimeColumn)(category) && category.timeGroup
206
+ ? category.timeGroup
207
+ : undefined;
208
+ const scaleType = category &&
209
+ ((0, chartBuilder_1.isColumnDate)(category) || (0, chartBuilder_1.isTimeColumn)(category)) &&
210
+ category.scaleType
211
+ ? category.scaleType
212
+ : undefined;
213
+ const valueLayer = Object.assign(Object.assign({}, parseLayer(category, valueColumn, 0, opts)), parseAxisLabels(valueColumn, opts));
214
+ list = [valueLayer];
215
+ if (dateGroup) {
216
+ list[0] = Object.assign(Object.assign({}, list[0]), { dateGroup });
217
+ }
218
+ if (timeGroup) {
219
+ list[0] = Object.assign(Object.assign({}, list[0]), { timeGroup });
220
+ }
221
+ if (scaleType) {
222
+ list[0] = Object.assign(Object.assign({}, list[0]), { scaleType });
223
+ }
224
+ if (opts.isMulti) {
225
+ const seriesValue = dimensions.series.length
226
+ ? dimensions.series[0]
227
+ : valueColumn;
228
+ list[0].multiserie = {
229
+ maxDataPoints: (0, chartBuilder_1._get)(opts, "globalSettings.max_series_point.value", true),
230
+ maxNumDataPoints: (0, chartBuilder_1._get)(opts, "globalSettings.max_series_point.option", 50),
231
+ type: opts.stylesSettings.bar_type,
232
+ serie: Object.assign(Object.assign({}, seriesValue), { property: parsePropertyComplexData(seriesValue) }),
233
+ };
234
+ }
235
+ if (opts.isCombolayer) {
236
+ const dimensionProp = opts.type === "COMBINED_CHART" /* CHART_TYPE.COMBINED_CHART */ ? "values" : "series";
237
+ list = [
238
+ ...list,
239
+ ...getComboLayers(category, dimensions, opts, dimensionProp),
240
+ ];
241
+ }
242
+ if (opts.isTrend) {
243
+ list = [...list, getTrendLayer(dimensions.trend[0])];
244
+ }
245
+ if (opts.isSmallMultiples) {
246
+ list = [...list, getSmallMultipleLayer(dimensions.smallmultiple[0])];
247
+ }
248
+ if (opts.isReference) {
249
+ list = [...list, ...getReferenceLayers(dimensions.reference)];
250
+ }
251
+ if (opts.type === "HEATMAP_CHART" /* CHART_TYPE.HEATMAP_CHART */ && dimensions.pivots.length) {
252
+ list[0].pivot = Object.assign(Object.assign({}, dimensions.pivots[0]), { property: parsePropertyComplexData(dimensions.pivots[0]) });
253
+ list[0].pivotLabel = (0, chartBuilder_1._get)(opts.stylesSettings, "pivot_axis.custom_label");
254
+ }
255
+ if (opts.type === "TABLE_CHART" /* CHART_TYPE.TABLE_CHART */ ||
256
+ opts.type === "EXPANDABLE_TABLE_CHART" /* CHART_TYPE.EXPANDABLE_TABLE_CHART */ ||
257
+ opts.type === "CROSSTAB_CHART" /* CHART_TYPE.CROSSTAB_CHART */) {
258
+ list = [{ type: opts.type }];
259
+ }
260
+ if (opts.type === "BOXWHISKER_CHART" /* CHART_TYPE.BOXWHISKER_CHART */ && dimensions.pivots.length) {
261
+ list[0].distribution = Object.assign(Object.assign({}, dimensions.pivots[0]), { property: parsePropertyComplexData(dimensions.pivots[0]) });
262
+ }
263
+ if (opts.type === "GEO_CHART_BUBBLE" /* CHART_TYPE.GEO_CHART_BUBBLE */) {
264
+ list[0].mapType = { label: "BUBBLE" };
265
+ }
266
+ if (opts.type === "GEO_CHART_DOT" /* CHART_TYPE.GEO_CHART_DOT */) {
267
+ list[0].mapType = { label: "DOT" };
268
+ list[0].value = Object.assign(Object.assign({}, list[0].category), { property: parsePropertyComplexData(list[0].category) }); // fix https://qrveydev.atlassian.net/browse/CB-689
269
+ }
270
+ if (opts.type === "GEO_CHART_CHOROPLETH" /* CHART_TYPE.GEO_CHART_CHOROPLETH */) {
271
+ list[0].mapType = { label: "CHOROPLETH" };
272
+ }
273
+ /** ******* Tabular/multicolum based charts **********/
274
+ // logic here
275
+ return list;
276
+ }
277
+ function parseAxisLabels(valueColumn, opts) {
278
+ const Y_AXIS_ATTR = "y_axis.custom_label";
279
+ const X_AXIS_ATTR = "x_axis.custom_label";
280
+ const axisLabels = {
281
+ chartValuLabelTemp: (0, chartBuilder_1._get)(opts.stylesSettings, Y_AXIS_ATTR),
282
+ chartLabelTemp: (0, chartBuilder_1._get)(opts.stylesSettings, X_AXIS_ATTR),
283
+ };
284
+ if (opts.type === "COMBO_CHART" /* CHART_TYPE.COMBO_CHART */ ||
285
+ opts.type === "COMBINED_CHART" /* CHART_TYPE.COMBINED_CHART */) {
286
+ const valueStyleObj = opts.isCombolayer
287
+ ? valueColumn.comboLayer
288
+ : opts.stylesSettings;
289
+ if (opts.type === "COMBO_CHART" /* CHART_TYPE.COMBO_CHART */)
290
+ axisLabels.chartValuLabelTemp = (0, chartBuilder_1._get)(valueStyleObj, Y_AXIS_ATTR);
291
+ }
292
+ return axisLabels;
293
+ }
294
+ function parseLayer(category, value, index, opts) {
295
+ const isCombinedMainLayer = opts.type === "COMBINED_CHART" /* CHART_TYPE.COMBINED_CHART */ && index === 0;
296
+ const isCombinedOtherLayer = opts.type === "COMBINED_CHART" /* CHART_TYPE.COMBINED_CHART */ && index > 0;
297
+ const layerType = isCombinedMainLayer
298
+ ? (0, chartBuilder_1._get)(opts, "stylesSettings.combined_type")
299
+ : opts.type === "COMBO_CHART" /* CHART_TYPE.COMBO_CHART */ && opts.isStakedBar
300
+ ? "BAR_CHART" /* CHART_TYPE.BAR_CHART */
301
+ : (0, chartBuilder_1._get)(value, "comboLayer.layer_type");
302
+ const getOptions = () => isCombinedMainLayer
303
+ ? (0, chartBuilder_1._get)(opts, "stylesSettings")
304
+ : (0, chartBuilder_1._get)(value, "comboLayer");
305
+ const visualizationType = opts.type === "COMBINED_CHART" /* CHART_TYPE.COMBINED_CHART */
306
+ ? isCombinedMainLayer
307
+ ? layerType
308
+ : "COMBO_CHART"
309
+ : opts.type;
310
+ return {
311
+ category: Object.assign(Object.assign({}, category), { property: parsePropertyComplexData(category) }),
312
+ value: Object.assign(Object.assign({}, value), { property: parsePropertyComplexData(value), calculation: (0, chartBuilder_1.allowTableCalculation)(opts.type) &&
313
+ parseCalculation(value, opts, isCombinedOtherLayer) }),
314
+ aggregate: value ? value.aggregate : { label: "COUNT" },
315
+ type: getOldChartType(opts.type, opts.previousType, layerType),
316
+ visualization: (0, chartBuilderParse_1.parseStyleSettingByType)(visualizationType, opts, getOptions()),
317
+ property: parsePropertyComplexData(category),
318
+ index,
319
+ };
320
+ }
321
+ function parsePropertyComplexData(column) {
322
+ return (0, chartBuilder_1._get)(column, "property.value", null);
323
+ }
324
+ function parseCalculation(column = {}, chart, ignoreReset = false) {
325
+ const reset = getResetCalculation(column, chart, ignoreReset);
326
+ return (column.calculation && {
327
+ aggregate: (0, chartBuilder_1._get)(column, "calculation.value", "SUM"),
328
+ abbreviation: (0, chartBuilder_1._get)(column, "calculation.abbreviation"),
329
+ reset,
330
+ direction: chart.isMulti && !ignoreReset ? "vertical" : null,
331
+ });
332
+ }
333
+ function getResetCalculation(column = {}, chart, ignoreReset = false) {
334
+ if (chart &&
335
+ ((chart.type === "HEATMAP_CHART" /* CHART_TYPE.HEATMAP_CHART */ &&
336
+ chart.dimensions.pivots.length) ||
337
+ chart.isSmallMultiples ||
338
+ (chart.isMulti && !ignoreReset)))
339
+ return 0;
340
+ if (column.calculation &&
341
+ chart &&
342
+ (chart.type === "TABLE_CHART" /* CHART_TYPE.TABLE_CHART */ ||
343
+ chart.type === "EXPANDABLE_TABLE_CHART" /* CHART_TYPE.EXPANDABLE_TABLE_CHART */))
344
+ return chart.dimensions.categories.length > 1 &&
345
+ column.calculation.levels &&
346
+ column.calculation.levels.id !== "TABLE"
347
+ ? column.calculation.levels.colIndex
348
+ : null;
349
+ return null;
350
+ }
351
+ function parseSortOrder(chartType, column = {}) {
352
+ const sortDirection = column.sortOrder || typeof column.sorting !== "string"
353
+ ? (0, chartBuilder_1._get)(column, "sorting.order")
354
+ : column.sorting;
355
+ if (chartType === "CROSSTAB_CHART" /* CHART_TYPE.CROSSTAB_CHART */) {
356
+ // parse from simple string sorting-option to Crosstab (dateGroup) sorting-option object
357
+ const isDategroupSortOpt = typeof sortDirection === "string" && column.dateGroup;
358
+ return Object.assign(Object.assign({}, (typeof column.sorting !== "string" ? column.sorting : {})), { order: isDategroupSortOpt
359
+ ? {
360
+ [column.dateGroup.text]: sortDirection || "asc",
361
+ }
362
+ : sortDirection });
363
+ }
364
+ // parse from Crosstab (dateGroup) sorting-option object to simple string sortion-option
365
+ const isDategroupSortOpt = column.dateGroup && typeof sortDirection !== "string";
366
+ return Object.assign(Object.assign({}, (typeof column.sorting !== "string" ? column.sorting : {})), { order: isDategroupSortOpt
367
+ ? sortDirection && (0, chartBuilder_1._get)(column, `sorting.order.${column.dateGroup.text}`)
368
+ : sortDirection });
369
+ }
370
+ function getValue(category, dimensions, opts) {
371
+ if (opts.type === "BOXWHISKER_CHART" /* CHART_TYPE.BOXWHISKER_CHART */ ||
372
+ opts.type === "MINMAX_CHART" /* CHART_TYPE.MINMAX_CHART */)
373
+ return dimensions.values[0];
374
+ const value = dimensions.values[0] || category;
375
+ return getColumnFromDimension(value, dimensions, opts);
376
+ }
377
+ function getCategory(dimensions, opts) {
378
+ if (opts.type === "BOXWHISKER_CHART" /* CHART_TYPE.BOXWHISKER_CHART */ ||
379
+ opts.type === "MINMAX_CHART" /* CHART_TYPE.MINMAX_CHART */)
380
+ return dimensions.categories[0];
381
+ if ([
382
+ "GEO_CHART_DOT" /* CHART_TYPE.GEO_CHART_DOT */,
383
+ "GEO_CHART_BUBBLE" /* CHART_TYPE.GEO_CHART_BUBBLE */,
384
+ "GEO_CHART_CHOROPLETH" /* CHART_TYPE.GEO_CHART_CHOROPLETH */,
385
+ ].includes(opts.type))
386
+ return dimensions.categories[0];
387
+ const category = (0, chartBuilder_1._get)(dimensions, "categories[0]") || dimensions.values[0];
388
+ if (category && category.calculation)
389
+ delete category.calculation;
390
+ return getColumnFromDimension(category, dimensions, opts);
391
+ }
392
+ function getColumnFromDimension(column, dimensions, { isCombolayer, isMulti }) {
393
+ let _column = column;
394
+ if (_column) {
395
+ return _column;
396
+ }
397
+ if (isCombolayer || isMulti) {
398
+ _column = dimensions.series[0];
399
+ if (!isMulti) {
400
+ dimensions.series.shift();
401
+ }
402
+ }
403
+ return _column;
404
+ }
405
+ function getComboLayers(category, dimensions, opts, prop) {
406
+ const comboLayers = (0, chartBuilder_1._isEmpty)(dimensions[prop]) ? [] : [...dimensions[prop]];
407
+ if (opts.type === "COMBINED_CHART" /* CHART_TYPE.COMBINED_CHART */)
408
+ comboLayers.shift();
409
+ return comboLayers.map((value, index) => {
410
+ return Object.assign(Object.assign({}, parseLayer(category, value, index + 1, opts)), { layer: { label: (0, chartBuilder_1._get)(value, "comboLayer.layer_type") }, label: (0, chartBuilder_1._get)(value, "comboLayer.y_axis.custom_label", value.text), combopt: { label: "COMBO" }, axis: { label: (0, chartBuilder_1._get)(value, "comboLayer.y_axis.position") } });
411
+ });
412
+ }
413
+ function getTrendLayer(trend) {
414
+ return {
415
+ visualization: {
416
+ thickness: trend.thickness,
417
+ style: trend.line_style,
418
+ color: trend.color,
419
+ },
420
+ trendtype: { label: trend.type },
421
+ combopt: { label: "TREND" },
422
+ };
423
+ }
424
+ function getReferenceLayers(references) {
425
+ return references.map((ref) => ({
426
+ index: Date.now(),
427
+ axis: Object.assign(Object.assign({}, ref.axis), { property: parsePropertyComplexData(ref.axis) }),
428
+ aggregate: { label: ref.aggregate },
429
+ labelType: { label: !ref.custom_label ? "VALUE" : "CUSTOM" },
430
+ combopt: { label: "REFERENCE" },
431
+ label: ref.custom_label,
432
+ value: ref.value,
433
+ valuetype: ref.type,
434
+ visualization: {
435
+ color: ref.color,
436
+ fill: ref.fill,
437
+ thickness: ref.thickness,
438
+ style: ref.line_style,
439
+ opacity: ref.opacity,
440
+ },
441
+ }));
442
+ }
443
+ function getSmallMultipleLayer(column) {
444
+ return {
445
+ visualization: {
446
+ displayBorder: column.smallMultiple.borders,
447
+ maxMultiplePanels: column.smallMultiple.limit.value,
448
+ displayMultiplePanels: column.smallMultiple.limit.active,
449
+ labels: {
450
+ axis: column.smallMultiple.labels,
451
+ },
452
+ },
453
+ combopt: { label: "SMALL_MULTIPLES" },
454
+ smallMultiplesColumn: Object.assign(Object.assign({}, column), { property: parsePropertyComplexData(column) }),
455
+ groupValue: Object.assign({}, column.dateGroup), // Group Value is needed in old chart editor and an-panel. Best practice is to use dateGroup from column object
456
+ };
457
+ }
458
+ function getTrendsChartsConfig(trendInfo) {
459
+ trendInfo.trendByColumn.sorting = {
460
+ order: trendInfo.trendSort === "Asc" ? "asc" : "desc",
461
+ };
462
+ const opts = {
463
+ type: trendInfo.charType,
464
+ dimensions: {
465
+ categories: [trendInfo.trendByColumn],
466
+ pivots: [],
467
+ values: [trendInfo.column],
468
+ },
469
+ };
470
+ return getTableConfig(opts, true, true);
471
+ }
472
+ exports.getTrendsChartsConfig = getTrendsChartsConfig;
473
+ function getTableConfig(opts, inPreviewMode, isTrendChart = false) {
474
+ const fields = {};
475
+ const params = [
476
+ { objKey: "categories", fieldKey: "groupsList", type: "group" },
477
+ { objKey: "values", fieldKey: "columnsList", type: "column" },
478
+ ];
479
+ let count = 0;
480
+ params.forEach((param) => {
481
+ if (opts.dimensions[param.objKey].length) {
482
+ fields[param.fieldKey] = opts.dimensions[param.objKey].map((item) => {
483
+ const column = {
484
+ data: Object.assign(Object.assign({}, item), { property: parsePropertyComplexData(item) }),
485
+ index: new Date().getTime() + (0, chartBuilder_1.randomKey)(),
486
+ type: param.type,
487
+ label: item.label || item.text,
488
+ visualization: item.visualization || "Values",
489
+ aggregate: setTotalAggregateInPreview(item.totalAggregate, inPreviewMode),
490
+ calculation: opts.dimensions.categories.length
491
+ ? parseCalculation(item, opts)
492
+ : null,
493
+ dataField: (0, chartBuilder_1.columnKey)(item.id, item.type, item.property, count + 1),
494
+ qrveyid: item.qrveyid,
495
+ dateGroup: item.dateGroup,
496
+ sorting: parseSortOrder(opts.type, item),
497
+ sortIndex: item.sortIndex,
498
+ width: item.width,
499
+ };
500
+ if (item.aggregate)
501
+ column.groupAggregate = Object.assign({}, item.aggregate);
502
+ count += 1;
503
+ return column;
504
+ });
505
+ }
506
+ });
507
+ if (isTrendChart)
508
+ return { fields };
509
+ const isGrouped = fields.groupsList && !!fields.groupsList.length;
510
+ return {
511
+ fields,
512
+ isGrouped,
513
+ conditions: opts.conditions,
514
+ visualization: (0, chartBuilderParse_1.parseStyleSettingByType)("TABLE_CHART" /* CHART_TYPE.TABLE_CHART */, Object.assign(Object.assign({}, opts), { isGrouped })),
515
+ totals: opts.dimensions.tableTotals,
516
+ isMultipleSorted: opts.isMultipleSorted,
517
+ trendsChart: opts.trendsCharts || [],
518
+ };
519
+ }
520
+ function getCrosstabConfig(opts) {
521
+ const fields = {};
522
+ const params = [
523
+ { objKey: "pivots", fieldKey: "columnsList", type: "column" },
524
+ { objKey: "categories", fieldKey: "rowsList", type: "row" },
525
+ { objKey: "values", fieldKey: "valuesList", type: "data" },
526
+ ];
527
+ params.forEach((param) => {
528
+ const dimension = param.objKey === "values" && !opts.dimensions[param.objKey].length
529
+ ? [opts.dimensions.categories[0] || opts.dimensions.pivots[0]]
530
+ : opts.dimensions[param.objKey];
531
+ fields[param.fieldKey] = dimension.map((item) => {
532
+ const column = {
533
+ data: Object.assign(Object.assign({}, item), { property: parsePropertyComplexData(item) }),
534
+ index: new Date().getTime() + (0, chartBuilder_1.randomKey)(),
535
+ type: param.type,
536
+ qrveyid: item.qrveyid,
537
+ label: item.label || item.text,
538
+ sorting: parseSortOrder(opts.type, item),
539
+ };
540
+ if (item.dateGroup)
541
+ column.dateGroup = item.dateGroup;
542
+ if (item.aggregate && param.type === "data")
543
+ column.aggregate = Object.assign({}, item.aggregate);
544
+ return column;
545
+ });
546
+ });
547
+ const rowGrandTotals = [
548
+ "SHOW" /* CROSSTAB_TOTALS_OPTIONS.BOTH */,
549
+ "ROWSONLY" /* CROSSTAB_TOTALS_OPTIONS.ROWS */,
550
+ ].includes(opts.globalSettings.crosstab_totals.option);
551
+ const columnGrandTotals = [
552
+ "SHOW" /* CROSSTAB_TOTALS_OPTIONS.BOTH */,
553
+ "COLUMNSONLY" /* CROSSTAB_TOTALS_OPTIONS.COLUMNS */,
554
+ ].includes(opts.globalSettings.crosstab_totals.option);
555
+ return {
556
+ fields,
557
+ visualization: (0, chartBuilderParse_1.parseStyleSettingByType)("CROSSTAB_CHART" /* CHART_TYPE.CROSSTAB_CHART */, opts),
558
+ config: {
559
+ showBorders: false,
560
+ width: 442,
561
+ height: 361,
562
+ fieldChooser: { enabled: false },
563
+ fieldPanel: {
564
+ visible: opts.globalSettings.crosstab_labels.value,
565
+ showFilterFields: false,
566
+ allowFieldDragging: false,
567
+ showColumnFields: true,
568
+ showRowFields: true,
569
+ showDataFields: false,
570
+ texts: { columnFieldArea: "", rowFieldArea: "" },
571
+ },
572
+ rowHeaderLayout: "tree",
573
+ showRowGrandTotals: opts.globalSettings.crosstab_totals.value && rowGrandTotals,
574
+ showColumnGrandTotals: opts.globalSettings.crosstab_totals.value && columnGrandTotals,
575
+ showRowTotals: opts.globalSettings.crosstab_subtotals,
576
+ showColumnTotals: opts.globalSettings.crosstab_subtotals,
577
+ allowSorting: opts.globalSettings.crosstab_labels.options.sorting,
578
+ allowSortingBySummary: false,
579
+ },
580
+ };
581
+ }
582
+ function getGeoMapConfig(opts) {
583
+ const fields = {};
584
+ const params = [
585
+ { objKey: "categories", fieldKey: "categories", type: "column" },
586
+ { objKey: "values", fieldKey: "values", type: "column" },
587
+ ];
588
+ params.forEach((param) => {
589
+ if (opts.dimensions[param.objKey].length) {
590
+ fields[param.fieldKey] = opts.dimensions[param.objKey].map((item) => {
591
+ const column = {
592
+ data: Object.assign(Object.assign({}, item), { property: parsePropertyComplexData(item) }),
593
+ index: new Date().getTime() + (0, chartBuilder_1.randomKey)(),
594
+ type: param.type,
595
+ qrveyid: item.qrveyid,
596
+ };
597
+ if (item.aggregate && param.type === "data")
598
+ column.aggregate = Object.assign({}, item.aggregate);
599
+ return column;
600
+ });
601
+ }
602
+ });
603
+ return {
604
+ fields,
605
+ };
606
+ }
607
+ function isValidData(opts) {
608
+ let chartDimensions = [
609
+ "categories" /* CHART_DIMENSION.CATEGORIES */,
610
+ "values" /* CHART_DIMENSION.VALUES */,
611
+ ];
612
+ if (opts.isCombo) {
613
+ chartDimensions = [...chartDimensions, "series" /* CHART_DIMENSION.SERIES */];
614
+ }
615
+ if ([
616
+ "GEO_CHART_DOT" /* CHART_TYPE.GEO_CHART_DOT */,
617
+ "GEO_CHART_BUBBLE" /* CHART_TYPE.GEO_CHART_BUBBLE */,
618
+ "GEO_CHART_CHOROPLETH" /* CHART_TYPE.GEO_CHART_CHOROPLETH */,
619
+ ].includes(opts.type)) {
620
+ return !(0, chartBuilder_1._isEmpty)(opts.dimensions["categories" /* CHART_DIMENSION.CATEGORIES */]);
621
+ }
622
+ if (opts.type === "CROSSTAB_CHART" /* CHART_TYPE.CROSSTAB_CHART */)
623
+ chartDimensions = [...chartDimensions, "pivots" /* CHART_DIMENSION.PIVOT */];
624
+ return chartDimensions.some((dimension) => !(0, chartBuilder_1._isEmpty)(opts.dimensions[dimension]));
625
+ }
626
+ function getOldChartType(type, prevType, layerType) {
627
+ let chartType = type;
628
+ if (chartType === "COMBO_CHART" /* CHART_TYPE.COMBO_CHART */ ||
629
+ chartType === "COMBINED_CHART" /* CHART_TYPE.COMBINED_CHART */) {
630
+ chartType =
631
+ layerType || ((0, chartBuilder_1.isChartBasic)(prevType) ? prevType : "BAR_CHART" /* CHART_TYPE.BAR_CHART */);
632
+ }
633
+ if (chartType === "BAR_CHART_MS" /* CHART_TYPE.BAR_CHART_MS */) {
634
+ chartType = "BAR_CHART" /* CHART_TYPE.BAR_CHART */;
635
+ }
636
+ if (chartType === "LINE_CHART_MS" /* CHART_TYPE.LINE_CHART_MS */) {
637
+ chartType = "LINE_CHART" /* CHART_TYPE.LINE_CHART */;
638
+ }
639
+ if (chartType === "SYMBOL_CHART_MS" /* CHART_TYPE.SYMBOL_CHART_MS */) {
640
+ chartType = "SYMBOL_CHART" /* CHART_TYPE.SYMBOL_CHART */;
641
+ }
642
+ if ((0, chartBuilder_1.isChartMap)(type)) {
643
+ chartType = "GEO_CHART" /* CHART_TYPE.GEO_CHART */;
644
+ }
645
+ return chartType;
646
+ }
647
+ function getGlobalSettings(_chartType, opts) {
648
+ return (0, chartBuilderParse_1.parseGlobalSettingByType)(_chartType, opts);
649
+ }
650
+ function setTotalAggregateInPreview(totalAggregate, _inPreviewMode) {
651
+ if (!totalAggregate)
652
+ return;
653
+ return totalAggregate;
654
+ }